?? usart.c
字號(hào):
#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
//Mini STM32開發(fā)板
//串口1初始化
//正點(diǎn)原子@ALIENTEK
//技術(shù)論壇:www.openedv.com
//修改日期:2010/5/27
//版本:V1.3
//版權(quán)所有,盜版必究。
//Copyright(C) 正點(diǎn)原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改說明
//支持適應(yīng)不同頻率下的串口波特率設(shè)置.
//加入了對(duì)printf的支持
//增加了串口接收命令功能.
//修正了printf第一個(gè)字符丟失的bug
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//加入以下代碼,支持printf函數(shù),而不需要選擇use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//標(biāo)準(zhǔn)庫需要的支持函數(shù)
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定義_sys_exit()以避免使用半主機(jī)模式
_sys_exit(int x)
{
x = x;
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
USART1->DR = (u8) ch;
return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////
#ifdef EN_USART1_RX //如果使能了接收
//串口1中斷服務(wù)程序
//注意,讀取USARTx->SR能避免莫名其妙的錯(cuò)誤
u8 USART_RX_BUF[64]; //接收緩沖,最大64個(gè)字節(jié).
//接收狀態(tài)
//bit7,接收完成標(biāo)志
//bit6,接收到0x0d
//bit5~0,接收到的有效字節(jié)數(shù)目
u8 USART_RX_STA=0; //接收狀態(tài)標(biāo)記
void USART1_IRQHandler(void)
{
u8 res;
if(USART1->SR&(1<<5))//接收到數(shù)據(jù)
{
res=USART1->DR;
if((USART_RX_STA&0x80)==0)//接收未完成
{
if(USART_RX_STA&0x40)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收錯(cuò)誤,重新開始
else USART_RX_STA|=0x80; //接收完成了
}else //還沒收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收數(shù)據(jù)錯(cuò)誤,重新開始接收
}
}
}
}
}
#endif
//初始化IO 串口1
//pclk2:PCLK2時(shí)鐘頻率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整數(shù)部分
fraction=(temp-mantissa)*16; //得到小數(shù)部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口時(shí)鐘
RCC->APB2ENR|=1<<14; //使能串口時(shí)鐘
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO狀態(tài)設(shè)置
RCC->APB2RSTR|=1<<14; //復(fù)位串口1
RCC->APB2RSTR&=~(1<<14);//停止復(fù)位
//波特率設(shè)置
USART1->BRR=mantissa; // 波特率設(shè)置
USART1->CR1|=0X200C; //1位停止,無校驗(yàn)位.
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中斷
USART1->CR1|=1<<8; //PE中斷使能
USART1->CR1|=1<<5; //接收緩沖區(qū)非空中斷使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//組2,最低優(yōu)先級(jí)
#endif
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -