Professional Documents
Culture Documents
Giáo Trình Hệ Thống Nhúng - Phần 2 - CĐ Kỹ Thuật Cao Thắng - 1280959
Giáo Trình Hệ Thống Nhúng - Phần 2 - CĐ Kỹ Thuật Cao Thắng - 1280959
Lập trình nhúng hiện nay không xa lại gì với chúng ta, STM32 là chip của
ST, dựa trên nền lõi ARM Cortex-M. Dòng ARM Cortex™-M là thế hệ mới, thiết
lập các tiêu chuẩn mới về hiệu suất, chi phí, ứng dụng cho các thiết bị cần tiêu thụ
năng lượng thấp, và đáp ứng yêu cầu thời gian thực khắc khe.
Một số tính năng có sử dụng STM32 như: từ điện tử dân dụng (tivi, đầu máy,
máy giặt…), xe hơi đời mới, game, mobile, laptop … chỗ nào ARM cũng có mặt.
34
Chương 4. Lập trình nhúng trên ARM
Hình 4.3 So sánh tiêu thụ năng lượng giữa ARM và VĐK 16 bit hoặc 8 bit
Code cũng tương đối dễ vì được support gần như hết: ngoại vi (GPIO, I2C,
SPI, ADC, USB, Ethernet, CAN….), ST cung cấp cho chúng ta các thư viện trực
tiếp cho mỗi dòng ARM (gọi là CMSIS – Cortex
Microcontroller Software Interface Standard ), nhiệm vụ của chúng ta không thể
dễ dàng hơn: khai báo và sử dụng mà thôi …
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
2 bộ USART
12 Timers
16 kênh ADC -12bit
2 bộ I2C
2 bộ SPI
2 bộ Watchdog
16 bộ ngắt lập trình được
RTC (đồng hồ thời gian thực tích hợp)
…
Hình 4.4 so sánh 1 cách trực quan nhất giữa các dòng VXL 8 bit - 16 bit và
Cortex™-M qua hàm "nhân 2 số 16 bit" (Cortex™-M có thể nhân 2 số 32 bit chỉ
bằng 1 lệnh):
Hình
4.4 Comparing 16-bit multiply operations across processor architectures
35
Chương 4. Lập trình nhúng trên ARM
Dòng STM32F103 có nhân ARM vì vậy tương thích với tất cả công cụ và
phần mền dành cho ARM. Nó là sự kết hợp hiệu năng cao từ ARM Cortex-M3
CPU với nhiều thiết bị ngoại vi cũng như nâng cao tính năng I/O. STM32-103 Dev
1.0 cho phép bạn khám phá hoàn toàn nhưng tính năng mới của vi điều khiển ARM
Cortex M3 STM32F103RDT6 được 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 …
37
Chương 4. Lập trình nhúng trên ARM
3-bit prescaler gives 8 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 multi-
master 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 1 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 3 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 năng của chíp ở tài liệu datasheet và User
Manual.
38
Chương 4. Lập trình nhúng trên ARM
39
Chương 4. Lập trình nhúng trên ARM
40
Chương 4. Lập trình nhúng trên ARM
41
Chương 4. Lập trình nhúng trên ARM
42
Chương 4. Lập trình nhúng trên ARM
43
Chương 4. Lập trình nhúng trên ARM
Nút Reset
Nút WKUP
Nút thoát khỏi trạng thái ngủ của STM32
44
Chương 4. Lập trình nhúng trên ARM
Hướng dẫn cấu hình DIP SW1 để nạp chương trình qua
cổng USART1 với FLASH LOADER DEMOSTRATOR
trên board OPENCMX-STM3210D
Nạp qua
bootloader
Chạy chương
trình trong
ARM
45
Chương 4. Lập trình nhúng trên ARM
* Lưu ý: Các hàm được viết và đặt tên theo chuẩn CMSIS, lập trình viên cần
tuân theo các quy tắc của CMSIS khi sử dụng hàm, tránh viết lại các hàm truy cập
thẳng vào phần cứng khi không cần thiết.
4.3.2. Khởi tạo dự án mới
+ Mở Keil IDE, chọn menu “Project->New uVision Project” để tạo dự án
mới. Giả dụ đặt tên dự án mới này là 24h_Led.
* Lưu ý: Thường khi tạo project mới hệ thống file quản lý dự án của Keil hay
bố trí ở thư mục dự án, điều này dễ bị lẫn lộn với các file nguồn, ta nên tạo một
thư mục con để quản lý các file dự án này.
Chọn chip STM32F103RC cho board
46
Chương 4. Lập trình nhúng trên ARM
47
Chương 4. Lập trình nhúng trên ARM
Chúng ta sẽ lần lượt tích hợp các thư mục trong thư viện vào dự án như sau:
+ Nhóm “CMSIS”: thêm file core_cm3.c ở thư mục
“\Libraries\CMSIS\CM3\CoreSupport” và system_stm32f10x.c ở thư mục
“\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”
+ Nhóm “StdPeriph_Driver”: thêm các file liên quan đến điều khiển ngoạI
vi, ở dự án này chúng ta cần điều khiển cổng GPIO, UART nên cần thêm các
file: stm32f10x_gpio.c, stm32f10x_usart.c và stm32f10x_rcc.c ở thư mục
“\Libraries\STM32F10x_StdPeriph_Driver\src”.
+ Nhóm “Start up”: thêm file startup_stm32f10x_hd.s ở thư mục
“Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”.
+ Nhóm “User”: chứa file của người dùng, giả sử thêm file main.c của ta vào
đây.
48
Chương 4. Lập trình nhúng trên ARM
* Lưu ý: Đối với nhóm StdPeriph_Driver, nên căn cứ vào nhu cầu điều khiển
ngoại vi để thêm vào các file tương ứng, tránh thêm các file dư thừa vì làm tăng
thời gian biên dịch và tốn tài nguyên hệ thống.
+ Khai báo thư mục thư viện cho dự án. Sau khi thêm các file cần thiết cho
dự án, chúng ta chưa thể biên dịch thành công được vì còn thiếu đường dẫn tới các
file khai báo thư viện CMSIS.
49
Chương 4. Lập trình nhúng trên ARM
+ Để tiện sắp xếp tài nguyên của dự án, ta nên xếp các file tạm được sinh ra
bởI Keil vào các thư mục riêng
Tương ứng với các file object (tab Output) và linker (tab Listing) ta lưu trong
thư mục “Obj” và “Lst” cho tiện theo dõi sau này.
+ Cần lưu ý là với bộ thư viện CMSIS, chúng ta sử dụng khá nhiều kỹ thuật
“macro” trong lập trình. Có một số “macro” cần khai báo “define” sẵn trong dự án
để có thể biên dịch thành công.
50
Chương 4. Lập trình nhúng trên ARM
* Lưu ý: Nếu sử dụng bộ thư viện chuẩn cho thiết bị ngoại vi, nên khai báo
macro: USE_STDPERIPH_DRIVER.
Bấm F10 (hoặc F11) để chạy debug từng dòng lệnh đồng thời theo dõi giá trị
của Port C thay đổi.
51
Chương 4. Lập trình nhúng trên ARM
52
Chương 4. Lập trình nhúng trên ARM
Bạn chọn file nạp bằng cách bấm vào nút “…” Khi đó bạn trỏ tới file hex mà
bạn muốn nạp cho STM32. Xong bạn bấm button “Open”. Khi đó chương trình
sẽ ra trở lại màn hình như sau. Nếu bạn muốn chương trình kiểm tra lại nội
dung file nạp có đúng với nội dung của STM32 hay không bạn click chọn “Verify
after download”
B4: Bạn tiếp tục bấm “Next”
Khi nạp xong chương trình thông báo:
53
Chương 4. Lập trình nhúng trên ARM
54
Chương 4. Lập trình nhúng trên ARM
/* Tip: To avoid modifying this file each time you need to switch between these
devices, you can define the device in your toolchain compiler preprocessor.
- Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx
microcontrollers where the Flash memory density ranges between 16 and 32
Kbytes.
- Low-density value line devices are STM32F100xx microcontrollers where the
Flash memory density ranges between 16 and 32 Kbytes.
Phần trước là hướng dẫn chọn define, file startup cho chương trình. Tùy theo chip
tương ứng mà chúng ta cần khai báo cho đúng.
Muốn biết chip đang dùng thuộc loại nào thì khi khởi tạo project, lúc chọn chip có
hiển thị thông tin chip, chúng ta xem Flash bao nhiêu để chọn define cho đúng.
55
Chương 4. Lập trình nhúng trên ARM
MCU STM32F10x có nhiều loại với số lượng IO khác nhau. Mỗi port IO được cấu
hình bởi 2 thanh ghi 32bit (GPIOx_CRL&GPIOx_CRH)
- GPIOx_CRL : cấu hình các pin từ 0→7
- GPIO_CRH : cấu hình các pin từ 8→15
Có 8 chế độ IO có thể lập trình cho từng pin
- Input floating
- Input pull-up
- Input pull-down
- Analog input
- Output open-drain
- Output push-pull
- Alternate function push-pull
- Alternate function open-drain
Các bit mode[1:0] cấu hình chế độ input hoặc output
Mode info
00 input ( mặc định khi reset)
01 output max 10MHz
10 output Max 2Mhz
11 output Max 50 MHz
Dòng F3,F4 tốc độ các chân có thể cao hơn. Thường thì mình để tốc độ cổng ở tốc
độ tối đa luôn.
Các bit CNF[1:0] có ý nghĩa phụ thuộc vào trạng thái pin là input hay output
Input Mode :
CNF[1:0] info
56
Chương 4. Lập trình nhúng trên ARM
00 analog input
01 floating input(digital)
10 input với pullup/pulldown.
11 reserver
Output Mode :
CNF[1:0] info
00 output push/pull
01 output open drain
10 alternate output push/pull
11 alternate output open drain
Chú ý : chế độ input pullup/pulldown sẽ do giá trị bit tương ứng trên thanh ghi
ODR quyết định. Nếu sử dụng hàm chuẩn trong thư viện của ST thì có thể các bạn
không cần biết cũng làm được. Nhưng theo mình thì nên biết xem hàm mình dùng
nó tác động vào thanh ghi nào để lúc cần thì có thể gán trực tiếp cho nhanh Các
pin IO đều có dạng 5V tolerant (ngoài 2 pin chung chức năng với thạch anh đồng
hồ thời gian thực) tức là có thể nối với các thiết bị dùng chuẩn 5V. Mình thường
nối thêm con trở nhỏ nối tiếp với chân IO nếu nó là chế độ input (để phần điện áp
dư rơi trên đó tránh gây hỏng pin IO).
Sơ đồ các pin các bạn có thể tham khảo trong datasheet.Các thanh ghi quan trọng.
Input data register GPIOx_IDR
Ngoài ra còn có thanh ghi remap các chân vào ra của ngoại vi. Các bạn xem trong
datasheet để hiểu rõ hơn.
Trong thư viện “stm32f10x_gpio.h” các pin tương ứng đã được định nghĩa sẵn để
người dùng dễ sử dụng : GPIO_Pin_x
Các port được định nghĩa bằng tên GPIOx trong đó x: A,B,C,…G. Thực chất
GPIOx có dạng con trỏ trỏ tới địa gốc của port tương ứng.
Thư viện chuẩn của ST, để bật tắt các bit, ta sử dụng hàm GPIO_SetBit() và
GPIO_ReSetBit().
57
Chương 4. Lập trình nhúng trên ARM
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
Khai báo biến dữ 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 0 và 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 0 và Pin 1 ở mức logic thấp, thời gian delay là 100ms
GPIO_SetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1);
delay_ms(100);
Cho GPIOB-Pin 0 và Pin 1 ở mức logic cao, thời gian delay là 100ms
Xong, đoạn code chớp tắt led trên khá ngắn gọn và dễ hiểu. Và để kiếm tra tính
chính xác thì chúng ta nạp code cho VDK xem kết quả
Việc nạp code cho STM32 có nhiều cách:
- JTAG: nạp và gỡ rối, việc dùng JTAG được thực hiện trên KeilC nên rất thuận
tiện cho việc nạp code, debug , test sản phẩm,.. nhược điểm là phần cứng rườm rà.
- SWD : chuẩn giao tiếp 2 dây, nhỏ gọn đơn giản và chi phí thấp hơn so với JTAG
- Bootloader : phần cứng đơn giản, dễ thực hiện,… nhưng chỉ dùng cho việc nạp
code
58
Chương 4. Lập trình nhúng trên ARM
Trong chương trình chính ta chỉ cần đọc trang thái của các chân tín hiệu
tương ứng để điều khiển ouput ra led đơn hoặc các chức năng khác
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11); //đọc trạng thái trên từng Pin
GPIO_ReadInputData(GPIOA); //đọc trạng thái in put GPIO A
Trên KIT STM32 START hỗ trợ các bạn khối Led 7 thanh 4 số Anode chung có
sơ đồ như sau:
- Các chân điều khiển cấp nguồn LED7_[1 – 4] kết nối lần lượt với PORTB[12 –
15].
- Các chân dữ liệu A, B, C, D, E, F, G, Dp kết nối lần lượt với PORTA[0 – 7].
Ta có bảng mã hiển thị các số từ 0 – 9 trên Led 7 thanh:
Kit STM32 START hỗ trợ phần cứng Led 7 thanh 4 số Anode chung vì vậy các
bạn cần sử dụng phương pháp quét Led để điều khiển hiển thị.
59
Chương 4. Lập trình nhúng trên ARM
Phương pháp quét Led dựa trên sự lưu ảnh của mắt người. Mắt người phải mất
khoảng 25 ms để xử lý một hình ảnh (40 hình/s), vậy nếu cho Led sáng tắt với
khoảng thời gian nhỏ hơn 25 ms thì giá trị hiển thị trên Led giống như luôn sáng.
Để hiển thị lên màn hình Led 7 thanh 4 số, ta lần lượt cấp nguồn cho từng con Led
và bắn dữ liệu vào các chân data.
Vậy khoảng thời gian 1 con Led sáng – tắt là 4T < 25ms T < 6ms.
Trong bài toán này mình sử dụng TIM2 của STM32F103C8T6 để tạo khoảng thời
gian giữa 2 lần cấp nguồn T = 1ms.
- Lập trình hiển thị các số từ 0 – 9999 lên Led 7 thanh 4 số Anode chung
Sau khi khởi tạo thành công Project, các bạn thêm các File.c cần thiết vào các
Folder, cụ thể:
-Main: main.c
-User: led7.c
-Hàm SystemInit(): Đây là hàm khởi tạo nguồn Clock cho vi điều khiển (các bạn
có thể tham khảo thêm nguồn Clock cho STM32 tại đây, trong bài toán này mình
sử dụng nguồn Clock có tần số 72MHz.
- Hàm GPIO_Configuration(): Đây là hàm khởi tạo và cấu hình chức năng GPIO
(nằm trong File user_gpio thuộc Folder UserSTM32), đối với bài toàn này, các
bạn cần cấu hình:
+ các chân PA0 – PA7 là chân Output Push Pull, tốc độ trung bình 50MHz.
+ các chân PB12 – PB15 là 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 ________________________*/
}
-Hàm TIMER2_Configuration(): Đây là hàm cấu hình cho TIM2. Các bạn cấu
hình cho TIM2 xảy ra 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 4. Lập trình nhúng trên ARM
- Hàm delay_init(72): Đây là hàm khởi tạo để sử dụng các hàm delay_ms(),
delay_us() (nằm trong File user_delay thuộc Folder UserStm32), 72 là tần số
nguồn Clock sử dụng.
Sau 1 ms, ngắt tràn TIM2 xảy ra, các bạn thực hiện quét Led ở trình phục vụ ngắt
TIM2 void TIM2_IRQHandler(void) (nằm trong 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 mình sử dụng hàm hiển thị giá trị số lên Led 7 thanh void
LED7_Display(uint16_t Value) (nằm trong File led7 thuộc Folder User):
62
Chương 4. Lập trình nhúng trên ARM
-Các chân điều khiển LCD16x2 LCD_RS, LCD_RW, LCD_EN kết nối thứ tự
với các chân PORTB[12 – 14].
-Các chân dữ liệu của LCD16x2 LCD_D[4 – 7] kết nối thứ tự với các
chân PORTA[4 – 7].
Sau khi khởi tạo thành công Project, các bạn thêm các File.c cần thiết vào các
Folder, cụ thể:
-Hàm SystemInit(): Đây là hàm khởi tạo nguồn Clock cho vi điều khiển, trong
bài toán này mình sử dụng nguồn Clock có tần số 72MHz.
-Hàm GPIO_Configuration(): Đây là hàm khởi tạo và cấu hình chức năng GPIO
(nằm trong File user_gpio thuộc Folder UserSTM32), đối với bài toàn này, các
bạn cần cấu hình:
+ các chân PA[4 – 7] là chân Output Push Pull, tốc độ trung bình 50MHz.
+ các chân PB[12 – 14] là chân Output Push Pull, tốc độ trung bình 50MHz.
63
Chương 4. Lập trình nhúng trên 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 là hàm khởi tạo để sử dụng các hàm delay_ms(),
delay_us() (nằm trong File user_delay thuộc Folder UserStm32), 72 là tần số
nguồn Clock sử dụng.
- Các bạn khởi tạo LCD16x2 và lập trình hiển thị các 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 các bạn xem ở File lcd16x2 thuộc Folder User.
Biên dịch chương trình và nạp chạy demo trên KIT STM32
- Tạo một Project tương tự như với lập trình GPIO , chúng ta thêm driver
stm32f10x_uart.c trong thư viện CMIS vào để có thể lập trình truyền nhận dữ liệu
UART
64
Chương 4. Lập trình nhúng trên ARM
65
Chương 4. Lập trình nhúng trên ARM
b) Lập trình giao diện truyền nhận dữ 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 một form mới
66
Chương 4. Lập trình nhúng trên ARM
- Click chuột vào form1 để đổi tên cho project trong mục caption
Nhấp chuột vào biểu tượng textbox để lấy textbox ra màn hình
Trong phần thuộc tính của textbox xóa chữ text1 trong caption đi
- Tiếp tục chọn label để kéo label vào chương trình, thay đổi tên label trong thuộc
tính caption
29
- Chỉnh sửa và thêm một số thành phần để có form như hình dưới
67
Chương 4. Lập trình nhúng trên ARM
Như vậy ta đã tạo ra một Form các tham số a,b hiển thị với các textbox1,2. Nút
truyền là Command1 nút nhận là Command2, nút thoát là Command3
Form hoạt động như sau : Nhập các thông số trong text1, nhấn nút truyền để gửi
dữ liệu trong text1 ra cổng COM. Nhấn nút nhận thì dữ liệu nhận được sẽ hiển thị
lên text2. Phím Exit để thoát khỏi chương trình
Vì Control để điều khiển cổng COM-MSCOM không phải control cơ bản nên nó
không hiển thị trên tool, chúng ta phải lấy ra trong thư viện như sau
- Để soạn thảo code cho chương trình VB, ta click chuột vào vị trí bất kỳ trong
form
68
Chương 4. Lập trình nhúng trên ARM
- Để viết mã cho nút truyền ta click vào nút truyền và code như sau. Khai báo
thêm biến s để chứa giá trị của text
- Và nút Exit
- Chọn file – Make tut.exe để tạo file thực thi và chạy như một phần mềm thông
thường
RB5: nối với nút nhấn tích cực mức thấp, có tên là 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 đi vào cửa bấm vào mã số (gồm 5 số) và sau đó bấm ENTER
Nếu đúng mật mã 54321, RB6 sẽ 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 năng chống rung phím.
14. Thiết kế một 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 7 đoạn và relay bật tắt lò.
Cho điện áp tham khảo của ADC Vref = 5V, độ phân giải của cảm biến LM35 là
tuyến tính với 10mV/oC.
Cảm biến nhiệt độ được nối vào AN0 của PIC
Relay bật tắt lò được nối vào chân RE2 của port E
Hai led 7 đoạn anode chung nước nối vào 2 port B, C
Sau khi RESET, hai led 7 đoạn hiển thị nhiệt độ hiện tại của lò
Khi nhiệt độ trong lò nhỏ hơn 80oC thì RE2 được cài đặt bằng 1 để bật lò.
Khi nhiệt độ lớn hơn 120oC thì RE2 được cài đặt bằng 0 để tắt lò.
a) Hãy vẽ sơ đồ mạch chi tiết cho hệ thống trên
b) Hãy viết chương trình C để thực hiện chức năng điều khiển hệ thống trên.
15. Hãy viết chương trình điều khiển cho 16F877A để tạo xung ở ngõ ra B0 bao
gồm xung 10kHz và 1kHz lồng vào nhau mô tả như hình dưới. Chu kỳ nhiệm vụ
của xung 10kHz và 1kHz là 50%.
___||_||_||_||_||_________________||_||_||_||_||_______________
16. Hãy viết chương trình C cho PIC16F877A tạo xung vuông ở 2 ngõ ra RC0 và
RC1, với tần số xung clock lần lượt là 0.5KHz và 1KHz, duty cycle là 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ố 1 KHz bằng 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
[3]. Steve Heath, Embedded Systems Design, Second Edition, Newnes, 2002.
[5]. Đinh Công Đoan, Bài Giảng Hệ Thống Nhúng, Khoa CNTT Đại học SPKT
TP.HCM
72