配置 USART 以在 ARM thumb 程序集中发送字符

Configuring USART to send a character in ARM thumb assembly

我正在尝试使用我的 stm32 发送一个字符。我正在使用 Real Term 串行捕获程序并设置了 9600 的波特率。

我尝试编写了 USART 和 GPIOA 的初始化。到目前为止,当我重置我的设备时,它会向串行捕获程序发送一个 NULL 字符,所以我认为我至少在正确的轨道上。但是我已经尝试向 USART_DR 写入一个字符,但没有在串行捕获端看到该字符。

我一直在关注这个 link 作为指南 (http://www.micromouseonline.com/2009/12/31/stm32-usart-basics)

这里有一个 GPIO 寄存器的小指南

@; GPIOx
@; MODER [15:0] 
@;0:'00'-> input mode, which allows the GPIO pin to be used as an input pin,
@;1:'01'-> Output mode, which allows the GPIO pin to be used as an output pin,
@;3:'11'-> Analog mode, which allows the GPIO pin to be used as an Analog input pin and finally,
@;2:'10'-> Alternate function mode which allow the GPIO pins to be used by peripherals such as the UART, SPI e.t.c. 
@;OTYPER
@;'0'-> output push/pull
@;'1'-> output open drain
@;OSPEEDR
@;'x0': 2MHz Low speed
@;'01':10MHz Medium speed
@;'11': 50MHz High speed
@;OPUPDR
@;'00'-> No pull-up/pull-down
@;'01'-> pull up
@;'10'-> pull down
@;'11'-> Reserved

我是如何配置 USART 的:

根据指导,我需要设置PA9为交替功能模式,输出推挽,输出低速,无pull-up/pull-down。

然后我将 PA10 设置为通用输入,浮动(虽然我此时不需要使用它,但我只是想看看我是否可以先发送一个字符。)

接下来,我必须确保启用了 USART1 时钟。

我发现 RCC_APB2ENR(RCC APB2 外围时钟启用寄存器)位于 RCC_base 的 0x44 处。我是这样启用它的,

@; make sure USART1 is enabled clock
ldr r3,=RCC_BASE
ldr r2,[r3,#RCC_APB2ENR]
orr r2,#(1<<4)  @; set enable bit
str r2,[r3,#RCC_APB2ENR]

然后我设置了波特率,并启用了 CR1 TE 和 RE 位。

@; load the baud rate (9600), baud = fclk/(16*usartdiv), fclk=16*10^6
ldr r3, =USART1_BASE
mov r2, #0x683      @; Mantissa [15:4] 0x68=0d104 Frac [3:0] 0x3
str r2, [r3, #USART_BRR]

@; enable the USARTx_CR1_UE bit
ldr r2,  [r3, #USART_CR1]
orr r2, #(1<<13)
str r2, [r3, #USART_CR1]

@; enable the USARTx_CR1_TE bit
ldr r2, [r3, #USART_CR1]
orr r2, #(1<<3)
str r2, [r3, #USART_CR1]

@; enable the USARTx_CR1_RE bit
ldr r2, [r3, #USART_CR1]
orr r2, #(1<<2)
str r2, [r3, #USART_CR1]

我想我设置正确了!

但无济于事,我没有看到任何字符出现在我的串行捕获程序中。

我刚刚尝试将字符 A 放入数据寄存器,但没有收到任何信息。

ldr r3, =USART1_BASE
mov r2, #0x41 @; A
str r2, [r3, #USART_DR]

我已经好几天都在尝试调试出了什么问题,但我还没有找到答案。某种类型的帮助将不胜感激!谢谢。

我确实需要将 Moder 寄存器启用为交替功能模式。但我没有做的是启用供 USART1 使用的替代功能。

具体来说,对于引脚 9 (Tx),USART1 的替代功能可以在替代功能高位寄存器中设置。

此处有更多详细信息:(http://web.eece.maine.edu/~zhu/book/Appendix_I_Alternate_Functions.pdf)