找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2586|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

請教Proteus仿真stm32f401re的串口問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
88黑幣
使用Proteus仿真STM32F401,就一個(gè)串口發(fā)送,但是發(fā)送出來的都是0,我本來要發(fā)送字符'A'的。
懷疑是寄存器配置問題和串口時(shí)鐘問題,但是對著手冊看了好多遍也找不到問題,希望有人出手相助
  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;                                 //得到整數(shù)部分
  9.                 fraction = (uint16_t)((temp-mantissa)*16); //得到小數(shù)部分@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));//復(fù)用功能
  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));//復(fù)用功能
  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);         //設(shè)置OVER8=0
  73.        
  74.         USART1->BRR=mantissa;
  75.         //默認(rèn)是1 start  8 wordlength  1stopbit
  76.         USART1->CR1|=1<<3;          //串口發(fā)送使能
  77.         USART1->CR1|=1<<2;          //串口接收使能
  78.         USART1->CR1|=1<<5;            //接收緩沖區(qū)非空中斷使能
  79. ////        USART1->CR1|=1<<7;            //發(fā)送緩沖區(qū)非空中斷使能

  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);//等待發(fā)送結(jié)束

  92.                                 if (( GPIOA->IDR & 0x0001))//按下按鍵,開啟TXE中斷,準(zhǔn)備發(fā)送
  93.                 {
  94.                                 USART1->CR1|=1<<7;            //發(fā)送緩沖區(qū)非空中斷使能
  95. //                        USART1->DR = 0x0;//發(fā)送無用字節(jié)觸發(fā)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. }
復(fù)制代碼

這是電路圖,就PA9發(fā)送,PA10接收



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:124010 發(fā)表于 2022-4-19 10:28 | 只看該作者
太大了,沒法上傳整個(gè)工程,只能上傳main函數(shù)了,我改過的都在這里

main.zip

3.1 KB, 下載次數(shù): 5

回復(fù)

使用道具 舉報(bào)

板凳
ID:124010 發(fā)表于 2022-4-19 10:29 | 只看該作者
這是電路圖


回復(fù)

使用道具 舉報(bào)

地板
ID:123289 發(fā)表于 2022-4-19 14:50 | 只看該作者
當(dāng)你發(fā)送命令下達(dá)后,
發(fā)送的內(nèi)容需要每間隔一段時(shí)間移出一位,直至這個(gè)字節(jié)的數(shù)據(jù)全部移出發(fā)完,才會(huì)給出一個(gè)發(fā)送完成標(biāo)志。
當(dāng)然對方接收也會(huì)同時(shí)進(jìn)行的。
那么在這段時(shí)間里,你讓CPU干什么了?能說得清楚嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:124010 發(fā)表于 2022-4-19 14:53 | 只看該作者
yzwzfyz 發(fā)表于 2022-4-19 14:50
當(dāng)你發(fā)送命令下達(dá)后,
發(fā)送的內(nèi)容需要每間隔一段時(shí)間移出一位,直至這個(gè)字節(jié)的數(shù)據(jù)全部移出發(fā)完,才會(huì)給出 ...

我判斷的是TXE標(biāo)志位,數(shù)據(jù)從數(shù)據(jù)寄存器到移位寄存器,TXE就置1。
現(xiàn)在直接發(fā)送數(shù)據(jù)都是亂碼,就算發(fā)送,while循環(huán)等待TXE置1,再發(fā)送,最基礎(chǔ)的功能有問題,別提數(shù)據(jù)處理了。再說也沒處理,就是發(fā)到那個(gè)串口虛擬終端
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表