Настройка USART для отправки символа в сборке большого пальца ARM
Я пытаюсь отправить символ, используя мой stm32. Я использую программу Real Term для последовательного захвата и настроил скорость передачи 9600 бод.
Я попытался написать инициализацию для USART и GPIOA. Пока, когда я перезагружаю свое устройство, оно посылает символ NULL в программу последовательного захвата, так что я думаю, что по крайней мере на правильном пути. Но я попытался записать символ в USART_DR, и мне не повезло увидеть его на стороне серийного захвата.
Я следую по этой ссылке в качестве руководства ( 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 в качестве альтернативного режима работы, двухтактный выход, низкоскоростной выход и никакого подтягивания / опускания.
Затем я настроил PA10 в качестве ввода общего назначения, плавающего (хотя мне не нужно использовать это в данный момент, я просто пытаюсь понять, смогу ли я получить символ для отправки первым).
Затем я должен был убедиться, что часы USART1 были включены.
Я обнаружил, что RCC_APB2ENR(регистр разрешения периферийных часов RCC APB2) расположен в 0x44 от RCC_base. Я включил это так,
@; 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]
Уже пару дней пытаюсь отладить что не так, и я не нашел ответа. Некоторый вид помощи будет оценен! Спасибо.
1 ответ
Мне нужно было включить регистр модера в альтернативный режим работы. Но я не включил альтернативную функцию для использования в USART1.
В частности, для контакта 9 (Tx) альтернативная функция для USART1 может быть установлена в верхнем регистре альтернативной функции.
Более подробно здесь: ( http://web.eece.maine.edu/~zhu/book/Appendix_I_Alternate_Functions.pdf)