USART中斷接收程式

來源:互聯網
上載者:User

標籤:stm32 usart nvic

//usart.h

#ifndef __USART_H__#define __USART_H__#include "stm32f10x.h"#include <stdio.h>void GPIO_Configuration(void);void NVIC_Configuration(void);void USART_Configuration(void);#endif


//usart.c

#include "usart.h"//加入以下代碼,以支援printf()函數,而不需要選中use MicroLIB #if 1#pragma import(__use_no_semihosting)             //標準庫需要支援的函數               struct __FILE { int handle; }; FILE __stdout;       //定義_sys_exit()函數,以避免使用半主機模式_sys_exit(int x) { x = x; } //重定義fputs()函數int fputc(int ch, FILE *f){      while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);     USART_SendData(USART1,(uint8_t)ch);   return ch;}#endif void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;    //使能GPIO複用功能時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//TX複用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_Init(GPIOA,&GPIO_InitStructure);//RX浮空輸入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_Init(GPIOA,&GPIO_InitStructure);}void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void USART_Configuration(void){USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART_DeInit(USART1);USART_InitStructure.USART_BaudRate = 9600; 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_Tx | USART_Mode_Rx; USART_Init(USART1,&USART_InitStructure);//必須先使能USART1,再使能中斷。順序不可調換。因為中斷初始後程式直接跳進中斷函數裡面執行發送命令,故必須先使能USART,才能使發送正常。USART_Cmd(USART1,ENABLE);USART_ITConfig(USART1,USART_IT_TC,ENABLE);}


//main.c

#include "MyTime.h"#include "usart.h"#include <stdbool.h> const char arr[] = "Hello stm32,Hello usart!!!";int main(void){MySysTick_Init();GPIO_Configuration();NVIC_Configuration();USART_Configuration();while(1);}void USART1_IRQHandler(void)  {static s16 i = 0;static s16 nCount = sizeof(arr)/sizeof(arr[0]);static bool bFirstIn = true;//在發送資料的最開始,需要清除一下USART的標誌位if(bFirstIn){USART_ClearFlag(USART1,USART_IT_TC);bFirstIn = false;}if(USART_GetITStatus(USART1,USART_IT_TC) == SET){printf("%c",arr[i++]);MyDelay_ms(1000);if(i>=nCount){printf("\r\n");i=0;}}}

注意在對資料進行發送和接收的時候,要檢查USART的狀態,只有等到資料發送或接收完畢之後才能進行下一幀資料的發送或接收。採用USART_GetFlagStatus()函數。

同時還要注意的是,在發送資料的最開始,需要清除一下USART的標誌位,否則,第1位元據會丟失。因為在硬體複位之後,USART的狀態位TC是置位的。當包含有資料的一幀發送完成之後,由硬體將該位置位。只要當USART的狀態位TC是置位的時候,就可以進行資料的發送。然後TC位的置零則是通過軟體序列來清除的,具體的步驟是“先讀USART_SR,然後寫入USART_DR”,只有這樣才能夠清除標誌位TC,但是在發送第一幀資料的時候,並沒有進行讀USART_SR的操作,而是直接進行寫操作,因此TC標誌位並沒有清空,那麼,當發送第一幀資料,然後用USART_GetFlagStatus()檢測狀態時返回的是已經發送完畢(因為TC位是置1的),所以程式會馬上發送下一幀資料,那麼這樣,第一幀資料就被第二幀資料給覆蓋了,所以看不到第一幀資料的發送。


本文出自 “whatever957” 部落格,請務必保留此出處http://whatever957.blog.51cto.com/6835003/1631983

USART中斷接收程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.