stm32之USART/UART应用实例(详细)
- 硬件:STM32F103VCT6
- 開發(fā)工具:Keil uVision4
- 下載調(diào)試工具:ARM仿真器
USART與UART的區(qū)別:
usart:全雙工通用同步/異步串行收發(fā)器
uart:全雙工通用異步串行收發(fā)器
usart支持同步通訊時比uart多一條時鐘線,usart用于異步通訊時跟uart一樣。
單工: 只能單向傳輸數(shù)據(jù)
半雙工:某一個時刻只能接受或者發(fā)送的雙向傳輸數(shù)據(jù)
全雙工:可以同時進行接收和發(fā)送數(shù)據(jù)
異步:發(fā)送方發(fā)送一幀數(shù)據(jù)后不需要接受方應(yīng)答繼續(xù)發(fā)送下一幀
同步:發(fā)送方發(fā)送完一幀數(shù)據(jù)后需要等待接受方應(yīng)答才能發(fā)下一幀
串行:每一傳輸按位進行,在一個導線上一位一位一次傳輸
并行:每次傳輸按兩位或者兩位以上進行,通過幾根導線同一時刻可以進行多位傳輸
波特率:一秒鐘內(nèi)傳輸多少位數(shù)據(jù),單位:Bps(byte 字節(jié)每秒),發(fā)送設(shè)備與接收設(shè)備的波特率必須一致。
USART/UART是一種通用的標準接口,根據(jù)導線的電壓等不同也分為很多的同類,比如: RS485, RS422,RS232
stm32的usart編程應(yīng)用的步驟:
1.串口設(shè)備的的初始化
2.串口中斷優(yōu)先級的定義
3.發(fā)送函數(shù)USART_SendData、接收函數(shù)USART_ReceiveData
第二步是為了當串口接收到數(shù)據(jù)的時候系統(tǒng)會從主程序中跳轉(zhuǎn)到中斷里面去,然后再進行數(shù)據(jù)的讀取,當然如果少了這一步也是可以通訊的,方法就是在主函數(shù)中不斷查詢是否收到數(shù)據(jù),如此會占用很多資源,所以在所用的芯片有中斷的情況下最好使用中斷。
void USART1_Config(unsigned int bound) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/*使能端口時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/*USART1-TX輸出腳配置*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*USART1-RX接收腳配置*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);/*串口參數(shù)配置*/USART_InitStructure.USART_BaudRate = bound;//設(shè)置波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//一幀中傳輸或者接收的數(shù)據(jù)位數(shù)(8位/9位)USART_InitStructure.USART_StopBits = USART_StopBits_1;//定義發(fā)送的停止位個數(shù)USART_InitStructure.USART_Parity = USART_Parity_No ;//設(shè)置為不需要校驗USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用流控制模式USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//發(fā)送且接收使能USART_Init(USART1, &USART_InitStructure);/*使能接收終端*/USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/*配置好參數(shù)之后,使能USART1外設(shè)*/USART_Cmd(USART1, ENABLE); /*USART1終端優(yōu)先級的配置*/ } void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure; /*設(shè)置優(yōu)先級分組*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//指定IRQ通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//指定先占優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//從優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //定義的IRQ是被使能還是失能NVIC_Init(&NVIC_InitStructure); }/*重定向c庫函數(shù)printf到USART1,調(diào)用printf會將需要打印的數(shù)據(jù)從串口發(fā)送出去*/ int fputc(int ch, FILE *f) {USART_SendData(USART1, (unsigned char) ch);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); //等到USART1發(fā)送完成return (ch); }/*串口發(fā)送一個字符*/ void USART_SendChar(USART_TypeDef* pUSARTx, uint8_t c) {USART_SendData(pUSARTx, c);while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } / *串口發(fā)送一個字符串*/ void USART_SendString(USART_TypeDef* pUSARTx, char* str) {uint32_t n = 0;while (*(str + n) != '\0'){USART_SendChar(pUSARTx, *(str + n));n++;}while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }int main(void) {USART1_Config(9600);NVIC_Configuration();printf(“********************************”);printf(“hello ward!\r\n”);printf(“********************************”);While(1){} //阻止程序結(jié)束}還要在stm32f10x_it.c(中斷函數(shù)一般都會放在這里)文件里面實現(xiàn)串口中斷的處理函數(shù):
void USART1_IRQHandler(void) {unsigned char code;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ code=USART_ReceiveData(USART1);printf("%c",code); //將接受到的數(shù)據(jù)直接返回打印} }完成以上步驟,接好線就可以在電腦上使用串口調(diào)試助手進行調(diào)試,stm32會將所接收到的數(shù)據(jù)從串口再發(fā)送出去。
重定向c庫的printf函數(shù)還需要在項目設(shè)置里勾選:
僅供參考,錯誤之處以及不足之處還望多多指教
總結(jié)
以上是生活随笔為你收集整理的stm32之USART/UART应用实例(详细)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32CAN波特率计算小程序(QT源
- 下一篇: Qt程序怎么在别人的电脑上运行