Embedded 如何启用UART4 STM32F215?

Embedded 如何启用UART4 STM32F215?,embedded,stm32,cortex-m3,Embedded,Stm32,Cortex M3,我正在运行ST发布的标准CMSIS,包括libc和所有jazz。这是不起作用的代码 void __attribute__ ((constructor)) uart4_init() { // Enable the clock for uart4 RCC->APB1ENR |= 1 << 19; // Enable the clock for GPIO_C, which needs to be configured to pass-through UART4 RCC

我正在运行ST发布的标准CMSIS,包括libc和所有jazz。这是不起作用的代码

void __attribute__ ((constructor)) uart4_init() {
  // Enable the clock for uart4
  RCC->APB1ENR |= 1 << 19;
  // Enable the clock for GPIO_C, which needs to be configured to pass-through UART4
  RCC->AHB1ENR |= 1 << 2;

  // Set up the GPIOC 11 and 10 pins for UART use
  // Set to alternate function mode
  GPIOC->MODER &= ~(0b1111 << 20);
  GPIOC->MODER |= 0b1010 << 20;
  // Finally set Alternate Function to UART4, to pass through the UART
  GPIOC->AFR[1] &= ~(0b11111111 << 8);
  GPIOC->AFR[1] |= 0b10001000 << 8;

  // Set up the UART port for reasonable sending settings
  // Here follows explanations on all bits set to 1:
    // Enable the serial port
    // Set to nine bits, so we have one to spare for parity
    // (Leave default wakeup method, since unused?)
    // Enable parity
    // Enable odd parity (better at detecting speed mismatch)
    // (Do not set parity error interrupt on)
    // (Do not set transfer buffer empty interrupt on)
    // (Do not set transmission complete, since that is DMA specific)
    // (Do not set recieve buffer not empty interrupt on)
    // (Do not set idle interrupt since we don't use it)
    // (Do not enable transmitter until setup is fully done)
    // (Do not enable reciever until setup is fully done)
    // (Do not enable mute-mode, we don't use it)
    // (Do not send a break character)
  UART4->CR1 = 0b11011000000000; // Set everything up
  // The confusing part, setting the baud rate, is in separate function
  uart4_set_baud(b9600);
  // Enable sending and receiving
  UART4->CR1 |= 0b1100;
}
在阅读了工作代码(HAL代码,所以实际上很模糊)和文档之后,我仍然无法理解这一点

编辑:按照旧计时器的建议清理代码。现在应该是一个可用的示例


Edit2:删除中断,使其更普遍地可用作基本示例。特别是由于这些中断位还使您能够通过NVIC启用UART中断。

经过一些引导性的分解(感谢老定时器!)我现在得出结论,我在调试中读取了错误的地址,所以我认为不起作用的东西一直都在起作用

当UART4为0x40004c00时,我从0x40024c00读取的本质是什么

检查并更正后,我发现CR1的值为0x37a0,我已用二进制写入(启用时变为0x37ac),BRR的预期值为1666(如果我正确理解文档,应为9600波特…)


之后,我可以在向卡发送测试字节后检查状态寄存器,得出我已收到数据的结论,并验证我的波特率是否足够接近,因此它现在可以工作(足以继续测试)。

经过一些引导分解后(感谢旧计时器!)我现在得出的结论是,在调试过程中,我从错误的地址读取数据,因此我认为不起作用的东西一直都在起作用

当UART4为0x40004c00时,我从0x40024c00读取的本质是什么

检查并更正后,我发现CR1的值为0x37a0,我已用二进制写入(启用时变为0x37ac),BRR的预期值为1666(如果我正确理解文档,应为9600波特…)

之后,我可以在向卡发送测试字节后检查状态寄存器,得出我已收到数据的结论,并验证我的波特率是否足够接近,因此它现在可以工作(足以继续测试)

  • 当您使用CMSIS时,还可以使用人类可读的定义

    RCC->APB1ENR |= 1 << 19; 
    
    生动地展示了它的功能

    这里有更好的例子,比如:

     UART4->CR1 = 0b11011110100000;
    

    我认为

     UART4 -> CR1 |= USART_CR1_RE | USART_CR1_TE; 
    
    更容易阅读,更安全

  • 启用时钟后,您需要提供延迟或回读
  • 我不使用HAL,但我真的很喜欢低级别的HAL宏

     __HAL_RCC_UART4_CLK_ENABLE(); 
    
    哪种方法可以正确启用时钟(请记住,许多STM32在RCC域中存在错误,需要特殊的过程,这在勘误表页面中有描述)

    此宏与简单寄存器赋值+回读的效果相同,但它的作用正确,其名称描述了它的作用

  • 当您使用CMSIS时,还可以使用人类可读的定义

    RCC->APB1ENR |= 1 << 19; 
    
    生动地展示了它的功能

    这里有更好的例子,比如:

     UART4->CR1 = 0b11011110100000;
    

    我认为

     UART4 -> CR1 |= USART_CR1_RE | USART_CR1_TE; 
    
    更容易阅读,更安全

  • 启用时钟后,您需要提供延迟或回读
  • 我不使用HAL,但我真的很喜欢低级别的HAL宏

     __HAL_RCC_UART4_CLK_ENABLE(); 
    
    哪种方法可以正确启用时钟(请记住,许多STM32在RCC域中存在错误,需要特殊的过程,这在勘误表页面中有描述)


    此宏与简单寄存器分配+回读的效果相同,但它的功能正确,其名称描述了它的功能。

    在基本功能正常工作之前,您肯定不想启用中断。你说似乎没有时钟是什么意思?示波器显示了什么?您是否以hal/cmsis的方式设置了系统时钟,以使高级波特率功能正常工作?由于所有这些魔法(以及危险的cmsis),请反汇编代码并确认使用了正确的寄存器、正确的位等。您不需要$=然后|=uart配置寄存器,如果您想在tx和rx启用位中输入orr,请写入。您使用的是哪个板?是否使用pc10?无需干扰上拉,无需干扰gpio速度,更改模式并设置备用功能寄存器,使用gpio完成。在干扰uart之前,我始终使用计时器闪烁led,以验证基本时钟是否正在执行我认为它正在执行的操作,以及是否存在隐藏的除以2等。然后我工作到uart。有几次我没有示波器,我使用另一块mcu板,在从uart(N81 0x55)生成方波的同时,查找和测量相对于计时器的状态变化,看看它是否关闭,根据需要测量所有状态变化……在基本工作正常之前,您肯定不想启用中断。你说似乎没有时钟是什么意思?示波器显示了什么?您是否以hal/cmsis的方式设置了系统时钟,以使高级波特率功能正常工作?由于所有这些魔法(以及危险的cmsis),请反汇编代码并确认使用了正确的寄存器、正确的位等。您不需要$=然后|=uart配置寄存器,如果您想在tx和rx启用位中输入orr,请写入。您使用的是哪个板?是否使用pc10?无需干扰上拉,无需干扰gpio速度,更改模式并设置备用功能寄存器,使用gpio完成。在干扰uart之前,我始终使用计时器闪烁led,以验证基本时钟是否正在执行我认为它正在执行的操作,以及是否存在隐藏的除以2等。然后我工作到uart。有几次我没有示波器,我使用另一块mcu板,在从uart(N81 0x55)生成方波的同时,查找和测量相对于计时器的状态变化,并查看它是否关闭,根据需要测量所有状态变化……我将对此进行研究。不过,从本质上讲,编写位模式只需要我阅读索引硬件文档,而我在CMSIS上找不到好的文档来指导我使用定义。它们是逻辑的。不需要文件。请参见名称模式。当然了