欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
STM32f407串口輪詢和中斷 源程序詳細(xì)注釋
[打印本頁]
作者:
hcf007
時間:
2021-2-5 09:58
標(biāo)題:
STM32f407串口輪詢和中斷 源程序詳細(xì)注釋
這是剛接觸串口一些心得體會:輪詢方式將接收函數(shù)放在while循環(huán)中,每次循環(huán)cpu主動詢問并判斷是否有數(shù)據(jù)接收,接收占用CPU資源較多,所以一般使用串口中斷方式接收數(shù)據(jù),串口接收到數(shù)據(jù)后觸發(fā)中斷,cpu被打斷,中斷當(dāng)前任務(wù)去處理接收的數(shù)據(jù)。個人理解輪詢和中斷最大區(qū)別就是cpu主動和被動請求,如果大家還有其他理解,歡迎提出
單片機(jī)源程序如下:
#include "led.h"
#include "key.h"
#include "usart.h"
#include "systick.h"
#include "beep.h"
int main(void)
{
u8 buf[50];
LED_Init(); //LED初始化
KEY_Init(); //按鍵初始化
BEEP_Init(); //蜂鳴器初始化
USART1_Init(9600);//串口1初始化
while(1)
{
USART1_ReceString(buf);
printf("%s\r\n",buf);
if(strcmp((char*)buf,"開燈")==0)
{
LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
printf("主人,已為您開燈\r\n");
}
else if (strcmp((char*)buf,"關(guān)燈")==0)
{
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
printf("主人,已為您燈關(guān)\r\n");
}
else if (strcmp((char*)buf,"啟動蜂鳴器")==0)
{
BEEP_ON;
printf("回稟大人,蜂鳴器已響\r\n");
}
else if (strcmp((char*)buf,"關(guān)閉蜂鳴器")==0)
{
BEEP_OFF;
printf("回稟大人,蜂鳴器已關(guān)\r\n");
}
}
}
復(fù)制代碼
#include "usart.h"
//輸出重定向 (重新定義輸出方向)
int fputc(int ch,FILE *f)
{
while(!(USART1->SR&(1<<6)));//等待傳送已完成
USART1->DR = ch;
return ch;
}
/**********************************************************************
*函數(shù)名:u1_printf
*功 能:自定義的打印函數(shù)
*參 數(shù):格式參數(shù)
*返 回:無
*備 注:等效于庫 函數(shù)printf
**********************************************************************/
void u1_printf(char* fmt,...)
{
unsigned int i,length;
char TxBuff[100];
va_list ap;
va_start(ap,fmt);
vsprintf(TxBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)TxBuff);
for(i = 0;i < length;i ++)
{
while(!(USART1->SR&(1<<6)));
USART1->DR = TxBuff[i];
}
}
/**********************************************************************
*函數(shù)名:USART1_Init
*功 能:串口1初始化
*參 數(shù):波特率
*返 回:無
*備 注:
1.時鐘使能 GPIOA 和串口1
2.串口1引腳 TXD(PA9) RXD(PA10)配置為復(fù)用模式
**********************************************************************/
void USART1_Init(u32 bound)
{
float usartdiv;
u16 DIV_Mantissa;//整數(shù)部分
u16 DIV_Fraction;//小數(shù)部分
RCC->APB2ENR |= 1<<4;//串口1時鐘使能
RCC->AHB1ENR |= 1<<0;//PA端口使能
//PA9配置復(fù)用模式,且映射到USART1
GPIOA->MODER &=~(3<<9*2); //清零
GPIOA->MODER |=2<<9*2; //復(fù)用模式
GPIOA->OTYPER &=~(1<<9); //推挽
GPIOA->OSPEEDR &=~(3<<2*9); //清零
GPIOA->OSPEEDR &=1<<2*9; //速度25MHZ
GPIOA->AFR[1] &=~(0xf<<4);//4~7位清理
GPIOA->AFR[1] |=7<<4; //映射(選擇)
//PA10配置復(fù)用,且映射到到USART1
GPIOA->MODER |=2<<10*2; //復(fù)用功能
GPIOA->AFR[1] &=~(0xf<<8); //位清理
GPIOA->AFR[1] |=7<<8; //PA10映射到USART1
//CPU幫我們算波特率
usartdiv=84*1000000/16.0/bound;
DIV_Mantissa=usartdiv;
DIV_Fraction=(usartdiv-DIV_Mantissa)*16;
USART1->BRR=DIV_Mantissa<<4|DIV_Fraction;
USART1->CR1 |=1<<13|1<<3|1<<2;//串口使能,發(fā)送使能,接收使能
printf("串口1初始化\r\n");
}
/**********************************************************************
*函數(shù)名:USART1_ReceByte
*功 能:串口1接收單個字節(jié)
*參 數(shù):無
*返 回:字節(jié)數(shù)據(jù)
*備 注:
**********************************************************************/
u8 USART1_ReceByte(void)
{
while(!(USART1->SR&(1<<5)));//等待接收完成
return USART1->DR;//讀取數(shù)據(jù)
}
/**********************************************************************
*函數(shù)名:USART1_ReceByte
*功 能:串口1接收單個字節(jié)
*參 數(shù):無
*返 回:字節(jié)數(shù)據(jù)
*備 注:
**********************************************************************/
void USART1_ReceString(u8 *buf)
{
u8 ch;
while(1)
{
ch=USART1_ReceByte();
if(ch=='\r'||ch=='\n')
{
break;//接收
}
*buf++=ch;
}
*buf=0;//構(gòu)成字符串
}
復(fù)制代碼
全部程序51hei下載地址:
USART串口中斷.7z
(292.74 KB, 下載次數(shù): 20)
2021-2-5 15:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
USART(輪詢法接收數(shù)據(jù)).7z
(299.78 KB, 下載次數(shù): 13)
2021-2-5 15:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1