本帖最后由 13543016677 于 2019-12-9 15:55 编辑
不好意思, 看到你贴的代码, 一望无际的标准库, 太高(啰)大(嗦)了.
来踢个馆, 大家互相学习, 哈~~
以前我也标准库, 码字贼快, 一天码十页八页.
但调试时...., 死扑街, 这是哪个写的, 这里这里还有这里, 什么意思, 有毛关联, ......嗯, 好像 , 嗯, 前天晚上写的~~后来痛下决心, 项目都寄存器, 凡有库的, 强逼症发作, 一行行的杀掉, 调试时思路简单了, 头发也密了!!
贴几行现在工作的UART代码段, 有效代码20行才左右, 完成 引脚+USART+优先级, 哪里出错, 查来查去就这几行, 快!
void vUsart_Init() {
float T;
u16 M,F;
// 使能GPIO时钟, 宏定义, 方便代码复用
USART_CLOCK_CMD;
// GPIO初始化, 一行搞定: 端口+PIN+输出类型+上下拉+功能复用, 比原子哥的函数更爽
GPIOSet (USART_TX_GPIOx , USART_TX_PINx , MODE_AF , OTYPE_PP , OSPEED_50M , PUPD_UP , USART_AFx ); // TX
GPIOSet (USART_RX_GPIOx , USART_RX_PINx , MODE_AF , OTYPE_PP , OSPEED_50M _PUPD_UP, USART_AFx ); // RX
// USART初始化 115200-8-N-1
T=(float)(USART_CLK *1000000)/(USART_BRR *16); // 得到USARTDIV,OVER8设置为0
M=T; // 得到整数部分
F=(T-M)*16; // 得到小数部分,OVER8设置为0, *16=左移4位
M<<=4;
M=M+F;
USARTx ->BRR = M; // 设置波特率因子
USARTx ->CR1 = 0; // 清0
USARTx ->CR1 |= 0<<2; // 接收
USARTx ->CR1 |= 1<<3; // 发送
USARTx ->CR1 |= 0<<10; // 校验
USARTx ->CR1 |= 0<<12; // 字长
USARTx ->CR1 |= 1<<13; // 使能
NVICSet( USARTx_IQRn, 3); // 优先级设置, 也是自己改的函数, 全局组4, 16级抢占, 0级优先, 简单清晰
}
|