標(biāo)題:
STM32F407初學(xué)之串口:中斷收發(fā)字符串教程與源碼
[打印本頁(yè)]
作者:
csy-2015-06
時(shí)間:
2018-9-22 20:13
標(biāo)題:
STM32F407初學(xué)之串口:中斷收發(fā)字符串教程與源碼
串口初始化見(jiàn):
STM32F407初學(xué)之串口:查詢方式收發(fā)字符串教程與源碼
http://www.torrancerestoration.com/bbs/dpj-135607-1.html
(出處: 單片機(jī)論壇)
串口中斷步驟
1.串口初始化(略)
2.配置NVIC(設(shè)置優(yōu)先級(jí)別,讓NVIC相應(yīng)該中斷)
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority((7-3),2,2));//core_cmd.h->1629
NVIC_EnableIRQ(USART1_IRQn); //core_cmd.h->1547
3.模塊級(jí)中斷使能(使能串口中斷)
USART1->CR1 |=0x01<<5;
4.編寫中斷服務(wù)函數(shù)。//函數(shù)名在啟動(dòng)文件.S100行附近
#include "includes.h"
int main(void)
{
u8 data=10;
//NVIC優(yōu)先級(jí)分組
NVIC_SetPriorityGrouping(7-2) ;
LED_Init( );//LED初始化
Key_Init( );
Uart1_Init(84,115200);
while(1)
{
if(revice_ok)
{
revice_ok=0;//清除標(biāo)志
printf("%s\r\n",rev_buf);//回發(fā)數(shù)據(jù)給PC端
if( strcmp((const char *)rev_buf,(const char *)"OPEN") ==0)
{
LED1(0);//LED2(0);LED3(0);LED4(0);
}
if( strcmp((const char *)rev_buf,(const char *)"CLOSE")==0 )
{
LED1(1);//LED2(1);LED3(1);LED4(1);
}
}
}
}
復(fù)制代碼
#include "uart.h"
#include "stdio.h"
//函數(shù)功能:串口1初始化
//參數(shù)說(shuō)明:串口時(shí)鐘頻率 要設(shè)置的波特率
//返回值:無(wú)
//注意事項(xiàng):無(wú)
//時(shí)間:2018/9/20
//作者:
void Uart1_Init(u16 fck,u32 bond)
{
float USARTDIV;u32 DIV_Man;u32 DIV_Fra;
//1.IO口初始化 PA9---USART1_TX PA10-----USART1_RX
RCC->AHB1ENR |=0x01<<0;//GPIOA時(shí)鐘使能
GPIOA->MODER &=~(0x0F<<18);//清零
GPIOA->MODER |= (0x0a<<18);//PA9 10 復(fù)用功能
GPIOA->OTYPER &=~(0x01<<9);//PA9輸出推挽
GPIOA->OSPEEDR |=0x03<<18;//PA9高速
GPIOA->PUPDR &=~(0x0F<<18);//PA9 10 浮空
GPIOA->AFR[1] &=~(0xFF<<4);//清零
GPIOA->AFR[1] |= (0x77<<4);//PA9---USART1_TX PA10-----USART1_RX
// 2.串口1配置:
RCC->APB2ENR |=0x01<<4;//串口1時(shí)鐘使能
USART1->CR1=0;//寄存器清零
USART1->CR2 &=~(0x03<<12);
/*
16倍過(guò)采樣
1 起始位, 8 數(shù)據(jù)位, 1停止位
禁止奇偶校驗(yàn)控制
*/
//波特率配置
USARTDIV=fck*1000000.0/(16*bond);
DIV_Man=USARTDIV;
DIV_Fra=(USARTDIV-DIV_Man)*16+0.5;
USART1->BRR = DIV_Man<<4 | DIV_Fra;
USART1->CR1 |=0x01<<5;//接受中斷使能
//設(shè)置優(yōu)先級(jí)分組
NVIC_SetPriority(USART1_IRQn,NVIC_EncodePriority (7-2, 2,2));
//NVIC中斷使能
NVIC_EnableIRQ(USART1_IRQn);
USART1->CR1 |=0x01<<3;//開(kāi)啟發(fā)送器
USART1->CR1 |=0x01<<2;//開(kāi)啟接收器
USART1->CR1 |=0x01<<13;//開(kāi)啟串口1
}
//函數(shù)功能:串口1發(fā)送字符串
//參數(shù)說(shuō)明:帶發(fā)送字符串首地址
//返回值:無(wú)
//注意事項(xiàng):無(wú)
//時(shí)間:2018/9/20
//作者:
void Uart1_Send_String(u8 *p)
{
while(*p !='\0')
{
while( !(USART1->SR&(0x01<<7)) );//發(fā)送緩沖區(qū)為空
USART1->DR=*p;
p++;
}
}
u8 rev_buf[100];//接收緩沖區(qū)
u8 addr=0; //地址偏移量
u8 revice_ok=0;//接收完成標(biāo)志
//串口1中斷服務(wù)函數(shù)
/*
注意:
1.接收過(guò)程發(fā)生多次中斷,并不是一次就接收完,PC端是一個(gè)字節(jié)一個(gè)字節(jié)的發(fā)送
單片機(jī)一個(gè)字節(jié)一個(gè)字節(jié)的接收,當(dāng)發(fā)送完再讀出一個(gè)完整的字符串。讀取過(guò)程與
查詢方式一樣。
2.串口助手發(fā)送時(shí),要以#做結(jié)尾,同時(shí)取消發(fā)送新行模式。
*/
void USART1_IRQHandler(void)
{
u8 data;
data=USART1->DR;//讀取同時(shí)會(huì)清除標(biāo)志
if(data=='#')//接收完成
{
rev_buf[addr]='\0';
addr=0;
revice_ok=1;
}
else//正常接收
{
rev_buf[addr++]=data;
}
}
//printf支持函數(shù)
#pragma import(__use_no_semihosting_swi) //取消半主機(jī)狀態(tài)
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
int fputc(int ch, FILE *f) {
while((USART1->SR &(0X01<<7))==0);
USART1->DR=ch;
return (ch);
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int ch) {
while((USART1->SR &(0X01<<7))==0);
USART1->DR=ch;
}
void _sys_exit(int return_code) {
label: goto label; /* endless loop */
}
復(fù)制代碼
全部資料51hei下載地址:
串口中斷接收字符串-添加特殊字符作結(jié)尾.rar
(1.22 MB, 下載次數(shù): 63)
2018-9-22 21:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1