找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1417|回复: 4
打印 上一主题 下一主题
收起左侧

请教Proteus仿真stm32f401re的串口问题

[复制链接]
跳转到指定楼层
楼主
88黑币
使用Proteus仿真STM32F401,就一个串口发送,但是发送出来的都是0,我本来要发送字符'A'的。
怀疑是寄存器配置问题和串口时钟问题,但是对着手册看了好多遍也找不到问题,希望有人出手相助
  1. int main(void)
  2. {
  3.                 /* USER CODE BEGIN 1 */
  4.                 float temp;
  5.                 uint16_t mantissa;
  6.                 uint16_t fraction;          
  7.                 temp=(float)(84*1000000)/(9600*16);//得到USARTDIV@OVER8=0
  8.                 mantissa = (uint16_t)temp;                                 //得到整数部分
  9.                 fraction = (uint16_t)((temp-mantissa)*16); //得到小数部分@OVER8=0
  10.                 mantissa<<=4;
  11.                 mantissa+=fraction;

  12.   /* USER CODE END 1 */

  13.   /* MCU Configuration--------------------------------------------------------*/

  14.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  15.   HAL_Init();

  16.   /* USER CODE BEGIN Init */

  17.   /* USER CODE END Init */

  18.   /* Configure the system clock */
  19.   SystemClock_Config();

  20.   /* USER CODE BEGIN SysInit */
  21.         RCC->CFGR = 0x001D040A;
  22.        
  23.   /* USER CODE END SysInit */

  24.   /* Initialize all configured peripherals */
  25. //  MX_GPIO_Init();
  26.   /* USER CODE BEGIN 2 */
  27.         //Enable and Config GPIO
  28.         RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;//button led usart1 use this
  29.         RCC->APB2ENR |= RCC_APB2ENR_USART1EN;//usart1

  30.                        
  31.         //LED PA1
  32.         GPIOA->MODER |= 1<<(1*2);//输出
  33.         GPIOA->PUPDR &= ~0x000C;//no pull
  34.         GPIOA->OSPEEDR |= 3<<(1*2);//速度 very high speed
  35.         GPIOA->OTYPER &= ~(1<<1*1);// push pull
  36.        
  37.         //button PA 0
  38.         GPIOA->MODER &= ~0x0003;//输入
  39.         GPIOA->PUPDR &= ~0x0003;//no pull
  40.        
  41.         //PA9 AF7 USART1 PA10 AF7 USART1
  42.         GPIOA->AFR[1] |= 0x00000770;
  43.        
  44.         ////        //PA9 TX
  45.     GPIOA->MODER  &= ~(0x03 << (9 * 2));//复用功能
  46.           GPIOA->MODER  |= (((uint32_t)0x02) << (9 * 2));
  47.                
  48.         GPIOA->OSPEEDR &= ~(3 << (9 * 2));//输出速度 high speed
  49.         GPIOA->OSPEEDR |= ((uint32_t)(0x02) << (9 * 2));
  50.                
  51. //        GPIOA->OTYPER  &= ~((1) << ((uint16_t)9)) ;//输出类型 推挽
  52. //        GPIOA->OTYPER |= (uint16_t)(((uint16_t)0x00) << ((uint16_t)9));
  53.                
  54.                 GPIOA->PUPDR &= ~( ((uint32_t)0x00000003) << ((uint16_t)9 * 2));//无上下拉
  55. //      GPIOA->PUPDR |= (((uint32_t)0x01) << (9 * 2));
  56.                
  57.        
  58.        
  59.         // PA10 RX
  60.         GPIOA->MODER  &= ~(0x03 << (10 * 2));//复用功能
  61.         GPIOA->MODER  |= (((uint32_t)0x02) << (10 * 2));
  62.                
  63.     GPIOA->OSPEEDR &= ~(3 << (10 * 2));
  64.     GPIOA->OSPEEDR |= ((uint32_t)(0x02) << (10 * 2));
  65.        
  66. //        GPIOA->OTYPER  &= ~((1) << ((uint16_t)10)) ;//输出类型 推挽
  67. //    GPIOA->OTYPER |= (uint16_t)(((uint16_t)0x00) << ((uint16_t)10));       
  68.                
  69.         GPIOA->PUPDR &= ~( ((uint32_t)0x00000003) << ((uint16_t)10 * 2));//无上下拉
  70. //    GPIOA->PUPDR |= (((uint32_t)0x01) << (10 * 2));
  71.        

  72.         USART1->CR1&=~(1<<15);         //设置OVER8=0
  73.        
  74.         USART1->BRR=mantissa;
  75.         //默认是1 start  8 wordlength  1stopbit
  76.         USART1->CR1|=1<<3;          //串口发送使能
  77.         USART1->CR1|=1<<2;          //串口接收使能
  78.         USART1->CR1|=1<<5;            //接收缓冲区非空中断使能
  79. ////        USART1->CR1|=1<<7;            //发送缓冲区非空中断使能

  80. HAL_NVIC_SetPriority(USART1_IRQn, 1, 1);
  81.         NVIC_EnableIRQ(USART1_IRQn);

  82.         USART1->CR1|=1<<13;//开启串口

  83.   /* USER CODE END 2 */

  84.   /* Infinite loop */
  85.   /* USER CODE BEGIN WHILE */
  86.   while (1)
  87.   {
  88.     /* USER CODE END WHILE */

  89.     /* USER CODE BEGIN 3 */
  90. //                                USART1->DR = 0x41;
  91. //                                while((USART1->SR&0X80)==0);//等待发送结束

  92.                                 if (( GPIOA->IDR & 0x0001))//按下按键,开启TXE中断,准备发送
  93.                 {
  94.                                 USART1->CR1|=1<<7;            //发送缓冲区非空中断使能
  95. //                        USART1->DR = 0x0;//发送无用字节触发txe中断

  96.                 }
  97.                
  98.                                                 GPIOA->ODR |=   (unsigned int)0x0002;
  99.         delay(999999);

  100.                                         GPIOA->ODR &=   ~(unsigned int)0x0002;
  101. delay(999999);


  102.   }
  103.   /* USER CODE END 3 */
  104. }
复制代码

这是电路图,就PA9发送,PA10接收



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:124010 发表于 2022-4-19 10:28 | 只看该作者
太大了,没法上传整个工程,只能上传main函数了,我改过的都在这里

main.zip

3.1 KB, 下载次数: 4

回复

使用道具 举报

板凳
ID:124010 发表于 2022-4-19 10:29 | 只看该作者
这是电路图


回复

使用道具 举报

地板
ID:123289 发表于 2022-4-19 14:50 | 只看该作者
当你发送命令下达后,
发送的内容需要每间隔一段时间移出一位,直至这个字节的数据全部移出发完,才会给出一个发送完成标志。
当然对方接收也会同时进行的。
那么在这段时间里,你让CPU干什么了?能说得清楚吗?
回复

使用道具 举报

5#
ID:124010 发表于 2022-4-19 14:53 | 只看该作者
yzwzfyz 发表于 2022-4-19 14:50
当你发送命令下达后,
发送的内容需要每间隔一段时间移出一位,直至这个字节的数据全部移出发完,才会给出 ...

我判断的是TXE标志位,数据从数据寄存器到移位寄存器,TXE就置1。
现在直接发送数据都是乱码,就算发送,while循环等待TXE置1,再发送,最基础的功能有问题,别提数据处理了。再说也没处理,就是发到那个串口虚拟终端
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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