BÀI 08: UART TRONG STM32F103.
- Sơ lược về lý thuyết.
- Đầy đủ các tính năng của bộ giao tiếp không đồng bộ.
- Điều chỉnh baud rate bằng lập trình và tốc độ tối đa lên đến 4.5Mb/s.
- Độ dài được lập trình là 8 hoặc 9 bit.
- Cấu hình bit stop hỗ trợ là 1 hoặc 2.
- Có chân clock nếu muốn chuyển giao tiếp thành đồng bộ.
- Cấu hình sử dụng 1 dây hoặc 2 dây.
- Có bộ DMA nếu muốn đẩy cao thời gian truyền nhận.
- Bit cho phép truyền nhận riêng biệt.
- Cấu hình với thư viện chuẩn của ST.
- B1- Cấp lock và khai báo các định nghĩa.
- B2- cấu hình GPIO cho 2 chân Rx và Tx.
- B3- Cấu hình UART với tốc độ Baud, số lượng data, bit chẵn lẻ, bit stop, mode truyền.
- B4 – Cấu hình ngắt nhận, enable ngắt UART và UART.
- B5- chương trình thực thi trong ngắt UART.
- Một số thanh ghi quan trọng.
- USART_SR – Status register.
- TXE : bit báo có data đã truyền hay không, =0 tức là data rỗng, có thể truyền, =1 data đã được truyền đi.
- RXNE: bit báo data đã nhận hay chưa =1: đã nhận, =0 chưa nhận hoặc nhận chưa xong.
- TC : cờ báo đã nhận data hoặc data vừa mới truyền xong.
- USART_DR – Data register.
- USART_BRR – Baud rate register.
- USART_CRx – Control register.
- UE: bit cho phép UART hoạt động.
- M: độ dài của data là 8 hay 9 bit.
- WAKE: phương pháp đáng thức UART là Idle line hoặc Address Mask.
- PCE : cho phép hoặc k cho phép parity.
- PS: chọn loại Parity chẵn hoặc lẻ.
- PEIE: cho phép ngắt PE hay k ngắt.
- TXEIE: cho phép ngắt truyền hay k.
- TCIE: cho phép ngắt khi truyền/nhận xong hay k.
- RXNEIE: cho phép ngắt nhận hay k.
- TE: cho phép truyền hay k.
- RE: cho phép nhận hay k.
- RWU : cho phép thức tỉnh hay không khi nhận dc data từ bên ngoài.
- USART_GTPR – Guard time and prescaler register.
- Bài tập.
- Viết chương trình gửi ký tự “A” lên máy tính với tốc độ baund là 9600, sử dụng phần mềm hercules để quan sát và module UART để truyền nhận với máy tính.
- Viết chương trình VĐK nhận được kí tự nào từ máy tính thì gửi lại kí tự đó lên lại máy tính với tốc đọ baund 115200. Sử dụng phần mềm hescules để gửi và quan sát kí tự nhận được.
- Sử dụng hàm printf từ thư viện stdio.h để truyền nhiều kí tự và số lên máy tính.
UART - Universal synchronous asynchronous receiver transmitter là một ngoại vi cơ bản và thường dùng trong các quá trình giao tiếp với các module như : Xbee, Wifi, Blutooth…. Khi giao tiếp UART kết hợp với các IC giao tiếp như MAX232CP, SP485EEN…. thì sẽ tạo thành các chuẩn giao tiếp RS232, RS485. Đây là các chuẩn giao tiếp thông dụng và phổ biến trong công nghiệp từ trước đến nay.
Khi ta sử dụng chân UART_CLK thì giao tiếp UART sẽ trở thành giao tiếp đồng bộ và không dùng sẽ là chuẩn giao tiếp không đồng bộ. Các bạn để ý là với bất cứ 1 chuẩn truyền thông nào, khi có sử dụng 1 chân tín hiệu làm chân CLK thì chuẩn giao tiếp đó sẽ là chuẩn giao tiếp đồng bộ và ngược lại. Ở đây mình chỉ đề cập đến giao tiếp UART không đồng bộ.
Ưu điểm của giao tiếp UART không đồng bộ: tiết kiệm chân vi điều khiển(2 chân), là ngoại vi mà bất kì 1 VĐK nào cũng có, có khá nhiều module, cảm biến dùng UART để truyền nhận data với VĐK. Nhược điểm của loại ngoại vi này là tốc độ khá chậm, tốc độ tối đa tùy thuộc vào từng dòng; quá trình truyền nhận dễ xảy ra lỗi nên trong quá trình truyền nhận cần có các phương pháp để kiểm tra(thông thường là truyền thêm bit hoặc byte kiểm tra lỗi). UART không phải là 1 chuẩn truyền thông, Khi muốn nó là 1 chuẩn truyền thông hoặc truyền data đi xa, chúng ta cần phải sử dụng các IC thông dụng để tạo thành các chuẩn giao tiếp đáng tin cậy như RS485 hay RS232....
Thông thường chúng ta sẽ dùng ngắt nhận UART để nhận dữ liệu vì sử dụng ngắt sẽ tiện lợi, không tốn thời gian chờ cũng như mất dữ liệu.Các tốc độ thường dùng để giao tiếp với máy tính: 600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200.
Một số phần mềm giao tiếp với máy tính: hercules_3-2-5,teraterm, Serial-Oscilloscope-v1.5...Một số modulde dùng để giao tiếp với máy tính: CP2102 USB 2.0, USB ra UART dùng PL2303, USB to UART dùng TTL FT232RL, USB ra UART dùng CH340G…
STM32F103C8 có 3 bộ UART với nhiều mode hoạt động, với nhiều bộ UART ta có thể sử dụng được nhiều ứng dụng với 1 chip điều khiển so với STM8S. Một số tính năng nổi bật như sau:
VD: Viết chương trình VĐK nhận được kí tự nào từ máy tính thì gửi lại kí tự đó lên lại máy tính. Sử dụng phần mềm hescules để gửi và quan sát kí tự nhận được.
Ở đây là cấu hình ngắt nhận nên cờ cho phép ngắt là USART_IT_RXNE.
Chương trình đợi data được nhận xong if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET), sau đó đảo trạng thái 1 led ở PB9 để biết là đã nhận. Gán data nhận vào biến data, đợi cờ truyền báo rỗi if(USART_GetITStatus(USART2, USART_IT_TXE) == RESET) rồi truyền data đi.
Lưu ý khi sử dụng các phần mềm giao tiếp với máy tính:
-
Phải để đúng tốc độ baund thì mới hiển thị đúng kí tự.
Cài đặt đúng cổng COM, datasize, parity.
Để đúng mode hex, text...
Cho phép CR/LF hay không.
Thanh ghi này chứa Data nhận và Data truyền gồm 9bit. Và nó phụ thuộc vào trạng thái truyền hoặc nhận sẽ quyết định đó là data truyền hoặc data nhận.
Thanh ghi này chứa giá trị tốc độ baund được cài đặt. DIV_Mantissa[11:0] là thành phần trước dấu “,” và DIV_Freaction[3:0] là thành phần sau dấu phẩy của tốc độ baud được quy đổi theo bảng sau:
Thanh ghi này chúng ta chỉ quan tâm đến PSC[7:0] là những bit cho phép bộ chia clock trong UART từ clock hệ thống để từ đó chia tốc độ baud cho hợp lý.
Link tải chương trình sử dụng hàm printf
This comment has been removed by the author.
ReplyDeleteanh cho em hỏi code được viết trên Keil C
Deletedùng thư viện cũ đúng k anh
nó có hỗ trợ trên thư viện mới HAL k vậy anh?
Có hỗ trợ bình thường nha bạn.
Deletelàm sao để viết chương trình gửi kí tự a lên máy tính a
ReplyDeleteBạn dùng hàm USART_SendData(x1,x2) để gửi dữ liệu lên máy tính nha. Trong đó x1 là cổng UART sử dụng vd : USART1, USART2... x2 là data cần truyền lên, độ dài tối đa là 16 bit. Chúc bạn thành công.
DeleteAnh ơi e muốn đọc loadcell lên stm32f103 và giao tiếp với pc qua usb pl2303 đc k a ,a có thể hướng dẫn giúp e được ở a
DeleteCảm ơn a nhiều
Hiện tại có rất nhiều loại Load cell trên thị trường và cách giao tiếp cũng khác nhau, mình không biết loadcell mà bạn sử dụng trả về giá trị dưới dạng thông số nào: tín hiệu số -digital (loadcell đã tích hợp bộ xử lí), tín hiệu tương tự - analog(trả về giá trị điện áp).... Phiền bạn nói cụ thể mình mới giúp được.
Deleteanh minh nguyen ơi, cảm ơn anh đã quan tâm ạ
Deletetinh hinh là e đã viết được code cho loadcell đọc duoc tin hiệu rồi qua con INa128 để khuếch đại
giờ e muốn giao tiếp nó voi máy tinh để hiển thị á a có thể giúp e không ạ
1 lần nữa Cảm Ơn anh ^^!
cho em hỏi là khi em nhập hàm như anh bảo em thấy xuất hiện lỗi em mới học về stm 32 mong anh giúp đỡ em ạ
ReplyDeletewhile (1)
{
UARTPrintf("Hello");
USART_SendData(X1,X2);
Delay_ms(1000);
}
Bạn hiểu sai ý mình rồi. X1, X2 chỉ là tên mà mình minh họa cho hàm cần truyền. Bạn có thể thay hàm USART_SendData(X1,X2); bằng hàm USART_SendData(USART2,'a'); để gửi kí tự a lên máy tính nếu bạn configuration UART sử dụng là UART2. Chú ý giá trị của 'a' tương ứng với 96 của số thập phân, và 0x61 của mã hex. Ngoài ra còn nhiều cách khác để gửi ký tự a lên máy tính.
Deleteanh có thể xem cho em sai đoạn nào được không ạ em muốn gửi nhiều kí tự lên máy tính ạ
ReplyDelete#include "stm32f10x.h"
/*Khoi tao bien cau hinh*/
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef UART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void GPIO_Configuration(void);
void Delay_ms(uint16_t time);
void UART_Configuration (void);
void AURTPrintf(char *message)
{
GPIO_Configuration();
UART_Configuration();
while (1)
{
}
}
void GPIO_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void UARTPrintf(char *message)
{
char *ch = message;
while (*ch)
{
UARTPrintf("chao cac ban");
USART_SendData();
Delay_ms(1000);
}
}
void Delay_ms(uint16_t time)
{
uint32_t time_n=time*12000;
while(time_n!=0){time_n--;}
}
void UART_Configuration (void)
{
/*Cap clock cho USART và port su dung*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Cau Tx mode AF_PP, Rx mode FLOATING */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*Cau hinh USART*/
UART_InitStructure.USART_BaudRate = 9600;
UART_InitStructure.USART_WordLength = USART_WordLength_8b;
UART_InitStructure.USART_StopBits = USART_StopBits_1;
UART_InitStructure.USART_Parity = USART_Parity_No;
UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &UART_InitStructure);
/* Cau hinh vector ngat va muc uu tien */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ClearFlag(USART2, USART_IT_RXNE); /* xoa co ngat nhan cho lan dau su dung*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);/* Cau hinh cho phep ngat nhan*/
USART_Cmd(USART2, ENABLE);/* Cho phep UART hoat dong */
}
1. Thứ 1 : bạn cần phân biệt được chương trình con và chương trình chính.
DeleteChương trình của bạn viết thiếu chương trình chính. Chương trình chính nằm trong
int main(void)
{
}
2. Thứ 2: các hàm gọi chương trình con ở trước chương trình chính phải có các dấu “;”. Chương trình của bạn thiếu ở hàm void AURTPrintf(char *message). Ngoài ra nó còn khác tên với chương trình con void UARTPrintf(char *message) mà bạn đã khai báo ở dưới.
3. Thứ 3: bạn không nên goi chương trình con trong khi khai báo chính bản thân đó, ví dụ như : UARTPrintf("chao cac ban"); trong chương trình con void UARTPrintf(char *message).
4. Thứ 4 : hàm USART_SendData(); thiếu đối số truyền vào. Bạn có thể click chuột phải -> goto define of để xem các khai báo thư viện của nhà sản xuất.
Mình không biết bạn có viết chương trình ở các file khác không nên chỉ đưa ra nhận xét khách quan như vậy. Mong bạn cố gắng nhiều hơn !!. Bạn có thể dùng hàm printf trong ví dụ mẫu thứ 2 của mình.
Cho em hỏi là em dùng Hercules nhưng vì sao nó ko nhận được cổng COM khác cho con stm32 được ạ. Hercules chỉ hiện mỗi cổng COM1 nhưng COM1 ko dành cho con STM32 đó, khi em cắm vào nó chỉ nhận được STM32 là USB thôi ạ. Có cách nào để nó nhận thành cổng COM ko ạ. Em dùng STM32F1C8T6 và lấy code truyền nhận kí tự của anh luôn ạ. Em cám ơn ạ.
ReplyDeleteMình không biết bạn dùng board STM32 nào để lập trình. Thông thường bạn phải dùng thêm module chuyển đổi từ uart to com để kết nối với máy tính. Bạn có thể search từ khóa "module uart to com ". Nếu bạn dùng Board của ST như các board nucleo thì máy tính sẽ nhận cổng COM luôn mà không cần dùng các module ngoài.
DeleteEm dùng BluePill á anh. Vậy em cần thêm 1 cái USB để PC nhận được phải không ạ? Và cho em hỏi là em muốn sử dụng C# để giap tiếp với kit có được không ạ, chỉ là truyền nhận kí tự thôi. Em có cần cài driver thì cho pc nữa không anh nhỉ? Mong anh giúp đỡ. Em cám ơn anh.
DeleteThis comment has been removed by the author.
DeleteCó phải bạn đang dùng trình duyệt Arduino IDE để lập trình cho STM32 phải không??. Vậy thì bạn tìm từ khóa "Cài đặt STM32 blue pill". Còn nếu bạn dùng Keil C thì cần dùng thêm module USB to Com, kết nối với chân vi điều khiển được lập trình UART. Bật hercules với tốc độ baund đúng thì sẽ hiển thị. thông thường thì các module USB to Com cần phải cài đặt driver nha. Còn dùng C# thì mình nghĩ là có thể giao tiếp được nhé.
Deleteanh ơi, anh đã bao giờ làm về stmf103 giao tiếp với module sim chưa ạ
ReplyDeleteanh có thể hướng dẫn em viết chương trình để điều khuyển module sim được không ạ
vd như gửi tin nhắn hay gọi điện
mong anh phản hồi em cảm ơn ạ
Chào bạn! Mình đã sử dụng qua module Sim rồi, mình chỉ đưa ra một số kinh nghiệm cá nhân mà mình rút ra được, còn cụ thể về cách làm thì bạn cần phải cố gắng tìm hiểu thêm:
Delete• Xác định module Sim sử dụng, cách thức sử dụng(tin nhắn, gọi điện, GPRS…). Mỗi module có cách kết nối(cấp nguồn, chân Data..) khác nhau và tập lệnh cũng khác biệt đôi chút.
• Xác định nguồn cấp cũng như chân kết nối để module hoạt động bình thường và không bị hư hỏng.
• Cách chính để giao tiếp với module Sim là sử dụng giao tiếp UART với tập lệnh AT. Nên bạn cần đọc kĩ tập lệnh cũng như những lưu ý.
• Ban đầu nên sử dụng một số loại module USB to Com và phần mềm chuyên dụng(vd module CP2102, phần mềm hercules) để kết nối trực tiếp với máy tính, kiểm tra việc truyền nhận sau đó mới viết chương trình bằng STM32.
• Đi từ những câu lệnh đơn giản nhất và kiểm tra(test) cách truyền nhận để biết module của mình hoạt động có chính xác và ổn định hay không – Có thể dùng mode debug để quan sát biến hoặc dùng 1 uart khác để gửi trở lên máy tính để biết data mình vừa nhận được từ UART sử dụng cho module sim(dùng ở chế độ run).
• Nên sử dụng ngắt UART để nhận dữ liệu từ module Sim. Ban đầu nên để tốc độ chậm, xác định được số lượng kí tự nhận thì việc viết chương trình nhận sẽ đỡ phức tạp hơn.
• Nếu sử dụng tin nhắn thì tin nhắn cần ngắn gọn và dễ dàng nhận biết để việc đọc đỡ phức tạp hơn.
• Xác định kí tự gửi đi và nhận về để tiện kiểm tra việc gửi và nhận có đúng hay không.
• Tham khảo các chương trình mẫu(code) viết bằng các vi điều khiển khác mà bạn có thể tìm kiếm được, từ đó làm theo cách viết chương trình của người khác để tìm hiểu nhiều hơn về cấu trúc cũng như cách lập trình.
Chúc bạn thành công, có cố gắng thì thành quả đạt được mới thật tuyệt vời.
cảm ơn anh đã giúp em hiểu hơn về stm32
Deletebài viết của anh rất chi tiết chúc anh luôn thành công trong sự nghiệp a
cho em hỏi lỗi no st-link connected làm sao để khắc phục ạ
ReplyDeleteLỗi này là do bạn chưa kết nối mạch nạp hoặc kết nối mà trình biên dịch(Keil C) chưa nhận được do lỗi(nối sai dây, chưa cài driver, chưa chọn chuẩn nạp đúng...). Bạn xem lại thử.
Deleteanh ơi làm sao để mình truyền nhân một mảng ký tự bằng vòng lặp while mà không được dùng lệnh printf
ReplyDeletethấy em nói nó gần tương tự như này nhưng em đọc mà không hiểu gì mong em giúp đỡ em
void DebugPrint(const char* str, ...)
{
va_list arp;
int d, r, w, s, l;
va_start(arp, str);
while ((d = *str++) != 0)
{
if (d != '%')
{
DebugPutc(d); continue;
}
d = *str++; w = r = s = l = 0;
if (d == '0')
{
d = *str++; s = 1;
}
while ((d >= '0')&&(d <= '9'))
{
w += w * 10 + (d - '0');
d = *str++;
}
if (s) w = -w;
if (d == 'l')
{
l = 1;
d = *str++;
}
if (!d) break;
if (d == 's')
{
DebugPuts(va_arg(arp, char*));
continue;
}
if (d == 'c')
{
DebugPutc((char)va_arg(arp, int));
continue;
}
if (d == 'u') r = 10;
if (d == 'd') r = -10;
if (d == 'X' || d == 'x') r = 16; // 'x' added by mthomas in increase compatibility
if (d == 'b') r = 2;
if (!r) break;
if (l)
{
DebugItoa((long)va_arg(arp, long), r, w);
}
else
{
if (r > 0)
DebugItoa((unsigned long)va_arg(arp, int), r, w);
else
DebugItoa((long)va_arg(arp, int), r, w);
}
}
va_end(arp);
Xin lỗi bạn, dạo này mình hơi bận nên không thể trả lời ngay được, bạn có thể dùng chương trình con dạng con trỏ nhé. Mình có chương trình sau bạn thử xem có được không nha:
Deletevoid UARTPrintf(uint8_t *message)
{
uint8_t *ch = message;
while (*ch) // vong lap truyen den ki tu cuoi cung
{
//UART1_SendData8((unsigned char) *ch); // truyen tung ki tu
USART_SendData(USART2,*ch);
while (USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET); // cho cho ki tu truyen xong
ch++;
}
}
Đối số truyền vào của chương trình con này là 1 mảng. Bạn có thể thử, chúc bạn thành công
em cảm ơn anh ạ
DeleteThis comment has been removed by the author.
Deletecái lệnh :
ReplyDeletePUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the LCD */
//lcd_Data_Write((u8)ch);
USART_SendData(USART2,(u8)ch);
/*Loop until the end of transmission */
while (USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET)
{}
return ch;
}
có tác dụng và nó làm gì hả anh.. em thấy nó trong file bài tập uart
Lệnh này khai báo để sử dụng hàm printf trong thư viện stdio.h. Nếu không có lệnh này thì hàm printf sẽ không chạy được, UART2 tương ứng với sử dụng hàm printf cho bộ uart 2.
DeleteThis comment has been removed by the author.
ReplyDeleteanh có thể cho em xin code mẫu giao tiếp uart điều khiển 2 stm32f1 để em tham khảo được không ạ? cả code nhận lẫn code truyền ạ. em xin cảm ơn.!!
ReplyDeleteDạ e Chào anh , e muốn giờ gửi tín hiệu từ con loadcell khi đặt vật cân lên, chuong trinh chính thi e có rồi nhưng để hiển thị nó lên hercules or C# thì mình phải làm sao ạ!
ReplyDeletevà minh cần dung usb pl2303 để giao tiếp nó phải kh a
e cảm ơn anh ạ
à a ơi e dùng Cube KelC lập trinh ạ
DeleteChào bạn mình đang bị vướng vấn đề dùng Printf của STM32. Mình làm khai báo uart ko lỗi nhưng dùng printf thì bị treo. còn truyền uart_sentdata thì ok. mong bạn giúp đỡ
ReplyDelete/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include
/** @addtogroup STM32F10x_StdPeriph_Examples
* @{
*/
USART_InitTypeDef USART_InitStructure;
void Delay_ms(uint16_t time);
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}
return ch;
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//Configure USART1 pins: Rx and Tx ----------------------------
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
USART_SendData(USART1, 49);
/* Output a message on Hyperterminal using printf function */
// printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
while (1)
{
USART_SendData(USART1, 49);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Delay_ms(1000);
USART_SendData(USART1, 48);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
Delay_ms(1000);
}
}
void Delay_ms(uint16_t time)
{
uint32_t time_n=time*12000;
while(time_n!=0){time_n--;}
}
Bạn đã sửa được chưa có thể hướng dẫn lại mình được không mình cũng bị treo
Delete#ifdef __GNUC__
ReplyDelete/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the LCD */
//lcd_Data_Write((u8)ch);
USART_SendData(USART2,(u8)ch);
/*Loop until the end of transmission */
while (USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET)
{}
return ch;
}
e không hiểu cáu trúc của những lệnh này ạ. a có thể giải thích cho e hoặc cho e xin tài liệu để tham khảo được không ạ