欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32F407初學之串口:中斷收發(fā)字符串教程與源碼
[打印本頁]
作者:
csy-2015-06
時間:
2018-9-22 20:13
標題:
STM32F407初學之串口:中斷收發(fā)字符串教程與源碼
串口初始化見:
STM32F407初學之串口:查詢方式收發(fā)字符串教程與源碼
http://www.raoushi.com/bbs/dpj-135607-1.html
(出處: 單片機論壇)
串口中斷步驟
1.串口初始化(略)
2.配置NVIC(設置優(yōu)先級別,讓NVIC相應該中斷)
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority((7-3),2,2));//core_cmd.h->1629
NVIC_EnableIRQ(USART1_IRQn); //core_cmd.h->1547
3.模塊級中斷使能(使能串口中斷)
USART1->CR1 |=0x01<<5;
4.編寫中斷服務函數。//函數名在啟動文件.S100行附近
#include "includes.h"
int main(void)
{
u8 data=10;
//NVIC優(yōu)先級分組
NVIC_SetPriorityGrouping(7-2) ;
LED_Init( );//LED初始化
Key_Init( );
Uart1_Init(84,115200);
while(1)
{
if(revice_ok)
{
revice_ok=0;//清除標志
printf("%s\r\n",rev_buf);//回發(fā)數據給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);
}
}
}
}
復制代碼
#include "uart.h"
#include "stdio.h"
//函數功能:串口1初始化
//參數說明:串口時鐘頻率 要設置的波特率
//返回值:無
//注意事項:無
//時間: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時鐘使能
GPIOA->MODER &=~(0x0F<<18);//清零
GPIOA->MODER |= (0x0a<<18);//PA9 10 復用功能
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時鐘使能
USART1->CR1=0;//寄存器清零
USART1->CR2 &=~(0x03<<12);
/*
16倍過采樣
1 起始位, 8 數據位, 1停止位
禁止奇偶校驗控制
*/
//波特率配置
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;//接受中斷使能
//設置優(yōu)先級分組
NVIC_SetPriority(USART1_IRQn,NVIC_EncodePriority (7-2, 2,2));
//NVIC中斷使能
NVIC_EnableIRQ(USART1_IRQn);
USART1->CR1 |=0x01<<3;//開啟發(fā)送器
USART1->CR1 |=0x01<<2;//開啟接收器
USART1->CR1 |=0x01<<13;//開啟串口1
}
//函數功能:串口1發(fā)送字符串
//參數說明:帶發(fā)送字符串首地址
//返回值:無
//注意事項:無
//時間: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;//接收完成標志
//串口1中斷服務函數
/*
注意:
1.接收過程發(fā)生多次中斷,并不是一次就接收完,PC端是一個字節(jié)一個字節(jié)的發(fā)送
單片機一個字節(jié)一個字節(jié)的接收,當發(fā)送完再讀出一個完整的字符串。讀取過程與
查詢方式一樣。
2.串口助手發(fā)送時,要以#做結尾,同時取消發(fā)送新行模式。
*/
void USART1_IRQHandler(void)
{
u8 data;
data=USART1->DR;//讀取同時會清除標志
if(data=='#')//接收完成
{
rev_buf[addr]='\0';
addr=0;
revice_ok=1;
}
else//正常接收
{
rev_buf[addr++]=data;
}
}
//printf支持函數
#pragma import(__use_no_semihosting_swi) //取消半主機狀態(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 */
}
復制代碼
全部資料51hei下載地址:
串口中斷接收字符串-添加特殊字符作結尾.rar
(1.22 MB, 下載次數: 63)
2018-9-22 21:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1