(NB) Tiếp nội dung phần 1 Giáo trình Hệ thống nhúng: Phần 2 cung cấp những kiến thức còn lại được trình bày như sau: Giới thiệu ARM STM32, giới thiệu KIT, tạo dự án với KEIL ARM, các bước nạp chương trình, lập trình nhúng trên ARM. Mời các bạn cùng tham khảo!
Chương Lập trình nhúng ARM CHƯƠNG LẬP TRÌNH NHÚNG TRÊN ARM 4.1 GIỚI THIỆU ARM STM32 Lập trình nhúng khơng xa lại với chúng ta, STM32 chip ST, dựa lõi ARM Cortex-M Dòng ARM Cortex™-M hệ mới, thiết lập tiêu chuẩn hiệu suất, chi phí, ứng dụng cho thiết bị cần tiêu thụ lượng thấp, đáp ứng yêu cầu thời gian thực khắc khe Hình 4.1 Hiệu ARM Cortex™-M Một số tính có sử dụng STM32 như: từ điện tử dân dụng (tivi, đầu máy, máy giặt…), xe đời mới, game, mobile, laptop … chỗ ARM có mặt TÍNH NĂNG NỔI BẬT: Hiệu suất cao Hình 4.2 Performance DMIP S/MHz Tiêu thụ lượng thấp 34 Chương Lập trình nhúng ARM Hình 4.3 So sánh tiêu thụ lượng ARM VĐK 16 bit bit Code tương đối dễ support gần hết: ngoại vi (GPIO, I2C, SPI, ADC, USB, Ethernet, CAN….), ST cung cấp cho thư viện trực tiếp cho dòng ARM (gọi CMSIS – Cortex Microcontroller Software Interface Standard ), nhiệm vụ dễ dàng hơn: khai báo sử dụng mà … Giá rẻ: STM32F1x khoảng 29000 đồng STM32F1x chạy với tốc đọ 24Mhz Flash 16 128K 37/51/80 chân I/O USART 12 Timers 16 kênh ADC -12bit I2C SPI Watchdog 16 ngắt lập trình RTC (đồng hồ thời gian thực tích hợp) … Hình 4.4 so sánh cách trực quan dòng VXL bit - 16 bit Cortex™-M qua hàm "nhân số 16 bit" (Cortex™-M nhân số 32 bit lệnh): Hình 4.4 Comparing 16-bit multiply operations across processor architectures 35 Chương Lập trình nhúng ARM 4.2 GIỚI THIỆU KIT Vi xử lý ARM Cortex-M3 hệ dòng vi xử lý ARM cho hệ thống nhúng Nó phát triển để cung cấp cho hệ thống giá thành thấp gần giống với MCU, với việc cắt giàm chân lượng thấp, đảm bảo khả tính tốn đáp ứng ngắt cao ARM Cotext M3 dự kiến trúc vi xử lý RISC tối ưu hiệu mã lệnh, lực đảm bảo từ nhân ARM kích thước nhớ thường kết hợp với 16 bit Dòng STM32F103 có nhân ARM tương thích với tất cơng cụ phần mền dành cho ARM Nó kết hợp hiệu cao từ ARM Cortex-M3 CPU với nhiều thiết bị ngoại vi nâng cao tính I/O STM32-103 Dev 1.0 cho phép bạn khám phá hồn tồn tính vi điều khiển ARM Cortex M3 STM32F103RDT6 phát triển từ ST Microelectronics Inc Một vài ứng dụng như: USB Mass Storage device, Audio class device, HID mouse device, CDC Virtual com port device … Hình 4.5 Kit STM32F103RDT6 4.2.1 Đặc tính kit MCU: STM32F103RDT6 ARM 32 bit CORTEX M3™ with 384K Program Flash, 64K Bytes RAM, USB, CAN, x2 I2C, x16 ADC, x2 DAC x5 UART, x2 SPI, x12 TIMERS, up to 72Mhz operation JTAG connector tiêu chuan v_i ARM 2x10 pin dành cho viec lập trình gỡ rối USB connector SD-MMC card, Audio, Microphone user buttions x3 user leds x3 RS-232 connector 36 Chương Lập trình nhúng ARM 10 RESET button 11 status LED 12 Mhz crystal oscillator 13 32768 Hz crystal and RTC backup battery 14 extension headers for all uC ports 15 Kích thước: 90.67 x 73.54mm (3.56 x 2.89") Yêu cầu từ board phát triển : Cáp USB 1.8m để nới với PC ( dành cho việc cấp nguồn giao tiếp USB trường hợp dùng đến tính USB ) Phần cứng : ARM-JTAG, ARM-USB-OCD, ARM-USB-TINY or other ARM JTAG compatible tool Phần mềm : + free open source platform: GNU C compiler + OpenOCD and Eclipse (support all low cost Olimex JTAG debuggers) + commercial solution EW-ARM from IAR Systems AB, require expensive J-LINK debugger + CrossWorks from Rowley (supports all Olimex low cost JTAG debuggers) 4.2.2 Đặc tính STM32F103RDT6 - CPU clock up to 72Mhz - FLASH 384KB - RAM 64KB - DMA x12 channels - RTC - WDT - Timers x11+1 - SPI x2 - I2C x2 - USART x5 - USB x1 - CAN x1 (multiplexed with USB so both can't be used in same time) - GPIO up to 51 (multiplexed with peripherials) - 16 kênh ADC 12-bit, DAC x2 - operating voltage 2.0-3.6V - temperature -40C +85C RS232: STM32F103RDT6 have USARTs which are available on the extension headers One of them can operate up to 4.5 Mbit/s, the other two up to 2.25 Mbit/s They provide hardware management of the CTS and RTS signals, IrDA SIR ENDEC support, are ISO 7816 compliant and have LIN Master/Slave capability.All USART interfaces can be served by the DMA controller SPI: STM32F103RDT6 have SPIs which able to communicate up to 18 Mbits/s in slave and master modes in fullduplex and simplex communication modes The 37 Chương Lập trình nhúng ARM 3-bit prescaler gives master mode frequencies and the frame is configurable from 8-bit to 16-bit The hardware CRC generation/verification supports basic SD Card/MMC modes Both SPIs can be served by the DMA controller I2C: STM32F103RDT6 have two I²C bus interfaces which can operate in multimaster and slave modes They can supportstandard and fast modes They support dual slave addressing (7-bit only) and both 7/10-bit addressing in master mode A hardware CRC generation/verification is embedded They can be served by DMA and they support SM Bus 2.0/PM Bus CAN: The STM32F103RDT6 CAN is compliant with specifications 2.0A and B (active) with a bit rate up to Mbit/s It can receive and transmit standard frames with 11-bit identifiers as well as extended frames with 29-bit identifiers It has three transmit mailboxes, two receive FIFOs with stages and 14 scalable filter banks.The CAN and USB share same pins PA11 and PA12, so you can’t use both CAN and USB on same time USB: The STM32F103RDT6 embeds a USB device peripheral compatible with the USB Fullspeed 12 Mbs The USB interface implements a full speed (12 Mbit/s) function interface It has software configurable endpoint setting and suspend/resume support The dedicated 48 MHz clock source is generated from the internal main PLL.The CAN and USB share same pins PA11 and PA12, so you can’t use both CAN and USB on same time ADC: STM32F103RDT6 have two 12-bit Analog to Digital Converters which share up to 16 external channels, performing conversions in singleshot or scan modes In scan mode, automatic conversion is performed on a selected group of analog inputs Additional logic functions embedded in the ADC interface allow: - Simultaneous sample and hold - Interleaved sample and hold - Single shunt The ADC can be served by the DMA controller.An analog watchdog feature allows very precise monitoring of the converted voltage of one, some or all selected channels An interrupt is generated when the converted voltage is outside the programmed thresholds The events generated by the standard timers (TIMx) and the Advanced Control timer (TIM1) can be internally connected to the ADC start trigger, injection trigger, and DMA trigger respectively, to allow the application to synchronize A/D conversion and timers Lưu ý: Tham khảo thêm tính chíp tài liệu datasheet User Manual 38 Chương Lập trình nhúng ARM 4.2.3 Sơ đồ nguyên lý board 39 Chương Lập trình nhúng ARM 40 Chương Lập trình nhúng ARM 4.2.4 Hướng dẫn set jump cho board Nguồn cung cấp cho mạch 41 Chương Lập trình nhúng ARM Cấp nguồn ( DC 5V ) Cấp nguồn từ USB 42 Chương Lập trình nhúng ARM 43 Chương Lập trình nhúng ARM Bắt đầu chường trình cho GPIO : #include "stm32f10x.h" Khai báo thư viện stm32f10x.h void delay_ms(uint32_t num); void delay_ms(uint32_t num) { uint32_t index = 0; for(index = (72000 * num);index !=0;index ) {} } Chương trình delay với độ phân giải 1ms, tức giá trị đặt 72000 ( 72MHz) Nếu bạn muốn độ phân giải 1us giá trị đặt 72 int main(void) { GPIO_InitTypeDef GPIO_InitStruct; Khai báo biến liệu để khởi tạo modul GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); Cho phép xung Clock PortB GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; Cầu hình chon Pin Pin 15 chế độ Push-Pull, tốc độ 50Mhz GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_ResetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1); Khởi tạo GPIOB while(1){ GPIO_ResetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1); delay_ms(100); Cho GPIOB-Pin Pin mức logic thấp, thời gian delay 100ms GPIO_SetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1); delay_ms(100); Cho GPIOB-Pin Pin mức logic cao, thời gian delay 100ms Xong, đoạn code chớp tắt led ngắn gọn dễ hiểu Và để kiếm tra tính xác nạp code cho VDK xem kết Việc nạp code cho STM32 có nhiều cách: - JTAG: nạp gỡ rối, việc dùng JTAG thực KeilC nên thuận tiện cho việc nạp code, debug , test sản phẩm, nhược điểm phần cứng rườm rà - SWD : chuẩn giao tiếp dây, nhỏ gọn đơn giản chi phí thấp so với JTAG - Bootloader : phần cứng đơn giản, dễ thực hiện,… dùng cho việc nạp code 4.5.2 Đọc trạng thái nút nhấn Tương tự lập trình GPIO điều khiển led đơn, ta cần khai báo thêm trạng thái input cho chân input GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); 58 Chương Lập trình nhúng ARM Trong chương trình ta cần đọc trang thái chân tín hiệu tương ứng để điều khiển ouput led đơn chức khác GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11); //đọc trạng thái Pin GPIO_ReadInputData(GPIOA); //đọc trạng thái in put GPIO A 4.5.3 Điều khiển LED đoạn a) Sơ đồ phần cứng Trên KIT STM32 START hỗ trợ bạn khối Led số Anode chung có sơ đồ sau: Hình 4.9 Sơ đồ kết nối board với LCD 16x2 Trong đó, chân kết nối với STM32F103C8T: - Các chân điều khiển cấp nguồn LED7_[1 – 4] kết nối với PORTB[12 – 15] - Các chân liệu A, B, C, D, E, F, G, Dp kết nối với PORTA[0 – 7] Ta có bảng mã hiển thị số từ – Led thanh: b) Lập trình phần mềm - Phương pháp quét Led Kit STM32 START hỗ trợ phần cứng Led số Anode chung bạn cần sử dụng phương pháp quét Led để điều khiển hiển thị 59 Chương Lập trình nhúng ARM Phương pháp quét Led dựa lưu ảnh mắt người Mắt người phải khoảng 25 ms để xử lý hình ảnh (40 hình/s), cho Led sáng tắt với khoảng thời gian nhỏ 25 ms giá trị hiển thị Led giống ln sáng Để hiển thị lên hình Led số, ta cấp nguồn cho Led bắn liệu vào chân data Gọi thời gian lần cấp nguồn T Vậy khoảng thời gian Led sáng – tắt 4T < 25ms T < 6ms Trong tốn sử dụng TIM2 STM32F103C8T6 để tạo khoảng thời gian lần cấp nguồn T = 1ms - Lập trình hiển thị số từ – 9999 lên Led số Anode chung Sau khởi tạo thành công Project, bạn thêm File.c cần thiết vào Folder, cụ thể: -FWlib: stm32f10x_gpio.c, stm32f10x_rcc.c, stm32f10x_tim.c, misc.c -Main: main.c -User: led7.c -UserSTM32: user_timer.c user_delay.c, user_gpio.c, user_interrupt.c, user_nvic.c, -StartUp: core_cm3.c, startup_stm32f10x_md.s, system_stm32f10x.c Trong hàm main.c bạn cần sử dụng: -Hàm SystemInit(): Đây hàm khởi tạo nguồn Clock cho vi điều khiển (các bạn tham khảo thêm nguồn Clock cho STM32 đây, tốn sử dụng nguồn Clock có tần số 72MHz -Hàm NVIC_Configuration(): Đây hàm cấu hình ngắt (nằm File user_nvic thuộc Folder UserSTM32), tốn sử dụng ngắt tràn TIM2 để tạo khoảng thời gian 1ms: void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 60 Chương Lập trình nhúng ARM - Hàm GPIO_Configuration(): Đây hàm khởi tạo cấu hình chức GPIO (nằm File user_gpio thuộc Folder UserSTM32), toàn này, bạn cần cấu hình: + chân PA0 – PA7 chân Output Push Pull, tốc độ trung bình 50MHz + chân PB12 – PB15 chân Output Push Pull, tốc độ trung bình 50MHz void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); /******************************* PORTA ***********************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /* _ OUTPUT _*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|G PIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* _ INPUT */ /**************************** PORTB *************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* _ OUTPUT _*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* _ INPUT _*/ } -Hàm TIMER2_Configuration(): Đây hàm cấu hình cho TIM2 Các bạn cấu hình cho TIM2 xảy ngắt sau thời gian 1ms: void TIMER2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Prescaler = 35999; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2,ENABLE); } 61 Chương Lập trình nhúng ARM - Hàm delay_init(72): Đây hàm khởi tạo để sử dụng hàm delay_ms(), delay_us() (nằm File user_delay thuộc Folder UserStm32), 72 tần số nguồn Clock sử dụng Sau ms, ngắt tràn TIM2 xảy ra, bạn thực quét Led trình phục vụ ngắt TIM2 void TIM2_IRQHandler(void) (nằm File user_interrupt thuộc Folder UserStm32): void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update)) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update); LED7_Display(Value_Display); } } Trong trình phục vụ ngắt sử dụng hàm hiển thị giá trị số lên Led void LED7_Display(uint16_t Value) (nằm File led7 thuộc Folder User): void LED7_Display(uint16_t Value) { LED7_CacuCode(Value); LED7_PowerOff(); LED7_DataOut(Led7_BufferData[Led7_Index]); LED7_PowerOn(Led7_Index); Led7_Index++; if(Led7_Index>=NUMBER_LED7)Led7_Index=0; } Thực thay đổi giá trị hiển thị lên Led vòng while(1): while(1) { Value_Display++; if(Value_Display > 9999) Value_Display = 0; delay_ms(500); } Biên dịch chương trình nạp chạy demo KIT STM32 START 4.5.4 LCD 16X2 bit a) Sơ đồ phần cứng 62 Chương Lập trình nhúng ARM Hình 4.9 Sơ đồ kết nối board với LCD 16x2 Trong đó, chân kết nối với STM32F103C8T: -Các chân điều khiển LCD16x2 LCD_RS, LCD_RW, LCD_EN kết nối thứ tự với chân PORTB[12 – 14] -Các chân liệu LCD16x2 LCD_D[4 – 7] kết nối thứ tự với chân PORTA[4 – 7] b) Lập trình phần mềm Sau khởi tạo thành công Project, bạn thêm File.c cần thiết vào Folder, cụ thể: -FWlib: stm32f10x_gpio.c, stm32f10x_rcc.c -Main: main.c -User: lcd16x2.c -UserSTM32: user_delay.c, user_gpio.c -StartUp: core_cm3.c, startup_stm32f10x_md.s, system_stm32f10x.c Trong hàm main.c bạn cần sử dụng: -Hàm SystemInit(): Đây hàm khởi tạo nguồn Clock cho vi điều khiển, tốn sử dụng nguồn Clock có tần số 72MHz -Hàm GPIO_Configuration(): Đây hàm khởi tạo cấu hình chức GPIO (nằm File user_gpio thuộc Folder UserSTM32), toàn này, bạn cần cấu hình: + chân PA[4 – 7] chân Output Push Pull, tốc độ trung bình 50MHz + chân PB[12 – 14] chân Output Push Pull, tốc độ trung bình 50MHz 63 Chương Lập trình nhúng ARM void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); /***************************** PORTA ***********************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /* OUTPUT _*/ GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* _ INPUT _*/ /**************************** PORTB ***********************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* _ OUTPUT */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* _ INPUT */ } - Hàm delay_init(72): Đây hàm khởi tạo để sử dụng hàm delay_ms(), delay_us() (nằm File user_delay thuộc Folder UserStm32), 72 tần số nguồn Clock sử dụng - Các bạn khởi tạo LCD16x2 lập trình hiển thị chuỗi ký tự: LCD16X2_Init(); LCD16X2_Gotoxy(0,0); LCD16X2_Puts((uint8_t*)" MinhHaGroup "); LCD16X2_Gotoxy(0,1); LCD16X2_Puts((uint8_t*)"KIT STM32 START "); while(1) { } Các hàm Driver cho LCD16x2 bạn xem File lcd16x2 thuộc Folder User Biên dịch chương trình nạp chạy demo KIT STM32 4.5.5 Lập trình UART giao tiếp PC a) Lập trình UART cho ARM STM32 - Tạo Project tương tự với lập trình GPIO , thêm driver stm32f10x_uart.c thư viện CMIS vào để lập trình truyền nhận liệu UART 64 Chương Lập trình nhúng ARM - Viết code cho chương trình hàm maic.c Khai báo IO cho UART: GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //USART1 TX GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_8; //USART1 RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); Cấu hình UART: void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; //Kich hoat Clock USART1 RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE); //Chon BaudRate USART_InitStructure.USART_BaudRate = 115200; //Chon dai khung truyen USART_InitStructure.USART_WordLength = USART_WordLength_8b; //Chon stop bit USART_InitStructure.USART_StopBits = USART_StopBits_1; //Chon Parity USART_InitStructure.USART_Parity = USART_Parity_No; //Chon che dieu khien USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Chon phuong thuc truyen nhan USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 65 Chương Lập trình nhúng ARM //Cau hinh cac thong so vua lua chon USART_Init(USART1, &USART_InitStructure); //Kich hoat hoat dong cua USART USART_Cmd(USART1, ENABLE); } Hàm ghi liệu Hàm đọc liệu từ cổng UART: USART_ReceiveData(USART1); Hàm gửi chuỗi liệu cổng UART: USART_SendString(USART1,"demo") b) Lập trình giao diện truyền nhận liệu UART dùng Visual Basic - Khởi động chương trình - Cửa sổ khởi động chọn StandardEXE để tạo form - Giao diện chương trình 66 Chương Lập trình nhúng ARM - Click chuột vào form1 để đổi tên cho project mục caption Nhấp chuột vào biểu tượng textbox để lấy textbox hình Trong phần thuộc tính textbox xóa chữ text1 caption - Tiếp tục chọn label để kéo label vào chương trình, thay đổi tên label thuộc tính caption - Tiếp tục với button 29 - Chỉnh sửa thêm số thành phần để có form hình 67 Chương Lập trình nhúng ARM Như ta tạo Form tham số a,b hiển thị với textbox1,2 Nút truyền Command1 nút nhận Command2, nút thoát Command3 Form hoạt động sau : Nhập thông số text1, nhấn nút truyền để gửi liệu text1 cổng COM Nhấn nút nhận liệu nhận hiển thị lên text2 Phím Exit để khỏi chương trình Vì Control để điều khiển cổng COM-MSCOM control nên khơng hiển thị tool, phải lấy thư viện sau - Kéo thả MSCOM vào form - Để soạn thảo code cho chương trình VB, ta click chuột vào vị trí form 68 Chương Lập trình nhúng ARM - Giao diện - Khai báo sử dụng cổng COM - Để viết mã cho nút truyền ta click vào nút truyền code sau Khai báo thêm biến s để chứa giá trị text - Tương tự cho nút nhận - Và nút Exit - Lưu form vừa tạo, chọn Run để chạy chương trình 32 - Kết quả: 69 Chương Lập trình nhúng ARM - Chọn file – Make tut.exe để tạo file thực thi chạy phần mềm thông thường 4.6 CÂU HỎI VÀ BÀI TẬP Trình bày thành phần mơ hình lập trình vi điều khiển ARM Trình bày số lệnh tập lệnh ARM Hàm bước thực gọi hàm Khái niệm ngắt chương trình phục vụ ngắt Các bước thực thi thực ngắt Viết CT Quét ma trận bàn phím Chống dội Viết CT đếm 00-99 hiển thị LCD 16x2 Viết CT hiển thị phút giây Led đoạn Viết CT điểu khiển led đơn sáng dần sau tắt dần 10 Viết chương trình cho vi điều khiển để giải phương trình bậc ax + b = Trong a b nhập từ port A B Kết hiển thị LCD 11 Viết chương trình C cho vi điều khiển để giải phương trình bậc hai ax^2 + bx + c = Trong đó, a, b c nhập vào từ port B, C, D Kết hiển thị serial LCD Hãy mô hệ thống phần mềm Proteus 12 Cho hệ thống nhúng sử dụng vi điều khiển mô tả sau: Port A (PA0, PA1, PA2) nối với nút nhấn tích cực mức thấp, có tên UP, DOWN, CLEAR Port B (PB0, PB1 … PB6) nối với LED đoạn Anode chung, có chân A, B, C, D, E, F, G Sau RESET, LED đoạn hiển thị số Khi nhấn nút UP, số hiển thị tăng (tối đa tăng đến số 9) Khi nhấn nút DOWN số hiển thị giảm (tối thiểu giảm đến số 0) Khi nhấn nút CLEAR, số hiển thị Khi khơng nhấn nút số hiển thị giữ nguyên a) Hãy vẽ sơ đồ mạch chi tiết cho hệ thống b) Hãy viết chương trình C để thực chức điều khiển hệ thống 13 Cho hệ thống nhúng điều khiển khóa cửa sử dụng PIC16F84 mô tả sau: RB0, RB1, RB2, RB3, RB4: nối với nút nhấn 1, 2, 3, 4, (tích cực mức thấp) 70 Chương Lập trình nhúng ARM RB5: nối với nút nhấn tích cực mức thấp, có tên ENTER RB6: điều khiển RELAY tích cực mức cao thông qua transistor RB7: điều khiển đèn LED cảnh báo tích cực mức cao Nguyên lý hoạt động: o Người vào cửa bấm vào mã số (gồm số) sau bấm ENTER Nếu mật mã 54321, RB6 tích cực mức cao để mở cửa Nếu sai mật mã, đèn LED cảnh báo sáng o Các nút nhấn có chức chống rung phím 14 Thiết kế hệ thống nhúng điều khiển nhiệt độ lò điện đơn giản Hệ thống sử dụng cảm biến nhiệt độ lò LM35, PIC16F877A, led đoạn relay bật tắt lò Cho điện áp tham khảo ADC Vref = 5V, độ phân giải cảm biến LM35 tuyến tính với 10mV/oC Cảm biến nhiệt độ nối vào AN0 PIC Relay bật tắt lò nối vào chân RE2 port E Hai led đoạn anode chung nước nối vào port B, C Sau RESET, hai led đoạn hiển thị nhiệt độ lò Khi nhiệt độ lò nhỏ 80oC RE2 cài đặt để bật lò Khi nhiệt độ lớn 120oC RE2 cài đặt để tắt lò a) Hãy vẽ sơ đồ mạch chi tiết cho hệ thống b) Hãy viết chương trình C để thực chức điều khiển hệ thống 15 Hãy viết chương trình điều khiển cho 16F877A để tạo xung ngõ B0 bao gồm xung 10kHz 1kHz lồng vào mô tả hình Chu kỳ nhiệm vụ xung 10kHz 1kHz 50% _||_||_||_||_|| _||_||_||_||_|| _ 16 Hãy viết chương trình C cho PIC16F877A tạo xung vuông ngõ RC0 RC1, với tần số xung clock 0.5KHz 1KHz, duty cycle 50% Hãy sử dụng ngắt Timer1 với thạch anh 4MHz 17 Hãy viết chương trình cho vi điều khiển PIC16F877A sử dụng thạch anh 20MHz tạo sóng sin có tần số KHz phương pháp có điều chế 10 KHz 18 Lập trình giao tiếp KIT STM32 với máy tính qua USART, lập trình truyền thông KIT với điện thoại Android qua Bluetooth 71 TÀI LIỆU THAM KHẢO [1] Andrew Sloss, Dominic Symes, Chris Wright, ARM System Developer's Guide: Designing and Optimizing System Software, Morgan Kaufmann, 2004 [2] RajKamal, Embedded Systems-Architecture, Programming and Design, McGraw Hill, 2003 [3] Steve Heath, Embedded Systems Design, Second Edition, Newnes, 2002 [4] Tammy Noergaard, Embedded Systems Architecture: A Comprehensive Guide for Engineers and Programmers, Newnes, 2005 [5] Đinh Công Đoan, Bài Giảng Hệ Thống Nhúng, Khoa CNTT Đại học SPKT TP.HCM 72 ... - FLASH 384KB - RAM 64KB - DMA x 12 channels - RTC - WDT - Timers x11+1 - SPI x2 - I2C x2 - USART x5 - USB x1 - CAN x1 (multiplexed with USB so both can't be used in same time) - GPIO up to 51... time) - GPIO up to 51 (multiplexed with peripherials) - 16 kênh ADC 1 2- bit, DAC x2 - operating voltage 2. 0-3 .6V - temperature -4 0C +85C RS2 32: STM32F103RDT6 have USARTs which are available on the... (GPIOx_CRL&GPIOx_CRH) - GPIOx_CRL : cấu hình pin từ 0→7 - GPIO_CRH : cấu hình pin từ 8→15 Có chế độ IO lập trình cho pin - Input floating - Input pull-up - Input pull-down - Analog input - Output open-drain - Output