Embedded 如何启用UART4 STM32F215?
我正在运行ST发布的标准CMSIS,包括libc和所有jazz。这是不起作用的代码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
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波特…) 之后,我可以在向卡发送测试字节后检查状态寄存器,得出我已收到数据的结论,并验证我的波特率是否足够接近,因此它现在可以工作(足以继续测试)
RCC->APB1ENR |= 1 << 19;
生动地展示了它的功能
这里有更好的例子,比如:
UART4->CR1 = 0b11011110100000;
或
我认为
UART4 -> CR1 |= USART_CR1_RE | USART_CR1_TE;
更容易阅读,更安全
__HAL_RCC_UART4_CLK_ENABLE();
哪种方法可以正确启用时钟(请记住,许多STM32在RCC域中存在错误,需要特殊的过程,这在勘误表页面中有描述)
此宏与简单寄存器赋值+回读的效果相同,但它的作用正确,其名称描述了它的作用
RCC->APB1ENR |= 1 << 19;
生动地展示了它的功能
这里有更好的例子,比如:
UART4->CR1 = 0b11011110100000;
或
我认为
UART4 -> CR1 |= USART_CR1_RE | USART_CR1_TE;
更容易阅读,更安全
__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上找不到好的文档来指导我使用定义。它们是逻辑的。不需要文件。请参见名称模式。当然了