OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3045|回复: 3

关于stm32f103zet6 寄存器法配置寄存器

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
发表于 2020-4-17 21:17:46 | 显示全部楼层 |阅读模式
用寄存器法配置USART1  检查了很多遍但是一直烧录进去一直用不了  
我还刻意通过红灯 绿灯现象来证明: 串口助手每发送一次数据 红灯亮 延迟 红灯灭 绿灯亮 延迟  绿灯灭
有现象 但就是接收不到数据  求各位大神帮忙看看 是哪里出了问题/双手合十



/*
        函数功能:串口初始化
        参数: 设置的波特率
        返回值: void
        提示: USARTDIV是存储在波特率寄存器BRR中的数值 由于是float型 所以只能分小数部分和整数部分存储
*/

void Usart_Init(u32 bps)
{
        float USARTDIV;
        u16 DIV_Mantissa;//尾数部分
        u16 DIV_Fraction;//小数部分
       
//开时钟
        RCC->APB2ENR |= (1<<2);//使能GPIOA
        RCC->APB2ENR |= (1<<14);//使能USART1时钟
//配置PA9 PA10
        GPIOA->CRH &= ~(0xFF << (4*(9-8)));
        GPIOA->CRH |= (0x4B << (4*(9-8)));//PB10浮空输入 PB9推挽输出
       
//配置USART1
        USART1->CR1 = 0;//8位数据位 禁止奇偶校验
        USART1->CR2 &= ~(0x3<<12);//1个停止位
       
//配置波特率
        USARTDIV = 72000000/(16*bps);
        DIV_Mantissa = (u16)USARTDIV;
        DIV_Fraction = (USARTDIV-DIV_Mantissa)*16;//小数部分左移四位
        USART1->BRR = ((DIV_Mantissa << 4) | DIV_Fraction);
       
        USART1->CR1 |= (0x3<<2);//使能发送 使能接收
        USART1->CR1 |= (0x1<<13);//使能USART
}



//函数功能:USART1发送一个字节
void Usart_Send_Byte(u8 data)
{
//        while((USART1->SR & (1<<7)) == 0)//为0 即TDR非空即上一个数据还没发送完成
        while(!(USART1->SR & (0x1<<7)))
        {
                //等待发送数据寄存器为空 即等待上一个数据发送完成
        }
        USART1->DR = data;
}

//函数功能:USART1接收一个字节
u8 Usart_Recv_Byte(void)
{
        //while((USART1->SR & (0x1<<5)) == 0)//RDR非空 为1非空 即接收到数据 为0 则RDR为空 即没接收到数据
        while(!(USART1->SR & (1<<5)))
        {
                //等待RDR非空 即等待RDR接收到数据
        }
        return USART1->DR;
}

现象图

现象图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-4-18 17:24:33 | 显示全部楼层
参考原子的寄存器设置,看可以不
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
 楼主| 发表于 2020-4-18 18:09:35 | 显示全部楼层
peng1554 发表于 2020-4-18 17:24
参考原子的寄存器设置,看可以不

和原子哥的配置几乎一样  不过他的端口输入模式是上拉输入我是浮空输入 我用的是查询等待方式发送和接收字符,他用的中断的方法发送和接收字符,其他都一样
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
 楼主| 发表于 2020-4-18 18:12:50 | 显示全部楼层
今天试着调试了下 发现个有很多可疑的地方不知道怎么解决 麻烦各位帮忙看一下
第一点: 调试到主函数中while循环里的串口发送字节函数(19行)的时候,串口发送字节函数 给USART1->DR寄存器赋值时,DR寄存器没有赋值,图片如下

DR寄存器.png

第二点:调试到主函数中while循环里的串口接收字节函数的时候(20行),串口接收字节函数一直会卡死在其while循环里,尽管我通过串口助手发送数据 USART1->SR寄存器中 RXNE位也没有置一,不知道为什么,调试图如下:
RDR.png

主函数及现象如下,但如果不注释串口1接收函数的话就会卡死在串口1接收函数中:
main.png

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 21:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表