Поиграв с разными светодиодами (Сделав мигалку на 2 светодиода), решил снова пойти к USART. Достал документацию на отладочную плату, там как раз выход USART1 находится на PA9, а он ничем не занят. Настроил его на максимальную скорость в режиме альтернативных функций. Подключил этот выход к своему модулю на FT232, настроил USART по мануалу, но ничего не выходит. После настройки (до попытки отправки байта), в терминал приходит "<0>". А далее, USART1 игнорирует любую попытку записи регистр DR (данные), при этом не меняя флагов (которые, кстати, показывают, что USART готов к приему). Вот код и проект под keil 4.
Код: Выделить всё
ck1 equ 0x20000000+0x101 ;Вершина стека. 0x2000 0000 - начало ОЗУ (СОЗУ).
GPIOBEN equ 0x00000002
GPIOB_MODER equ 0x40020400
MODER13_01 equ 0x04000000
PORTB_ODR equ 0x40020414
ODR13 equ 0x00002000
RCC_AHB1ENR equ 0x40023830
RCC_AHB1ENR_GPIOAEN equ 0x00000001 ;Тактирование порта A
RCC_APB2ENR equ 0x40023844
RCC_APB2ENR_USART1EN equ 0x00000010 ;Включение тактирования USART1.
GPORT_A_OSPEEDR equ 0x40020008 ;Скорость работы пина.
GPORT_A_MODER equ 0x40020000
MODER9_00 equ 0x00000000 ;Вход (после сброса).
MODER9_01 equ 0x04000000 ;01 - Режим вывода общего назначения.
MODER9_10 equ (1<<19) ;10 - Режим альтернотиыной функции.
MODER9_11 equ 0x0C000000 ;11 - Аналоговый режим.
;Скорость пина.
OSPEEDR9_00 equ 0x00000000 ;Низкая.
OSPEEDR9_01 equ 0x00040000 ;Средняя.
OSPEEDR9_10 equ 0x00080000 ;Быстрая.
OSPEEDR9_11 equ 0x000C0000 ;Высокая.
;USART1
USART1_BRR equ 0x40011008 ;Скорость USART.
USART1_CR1 equ 0x4001100C ;Настройки
USART_CR1_UE equ 1<<13
USART_CR1_TE equ 1<<3
USART_CR1_RE equ 1<<2
USART1_SR equ 0x40011000
USART1_SR_TXE equ 1<<6 ;Передача завершена.
USART1_DR equ 0x40011004 ;Сюда кидать данные.
AREA RESET, DATA, READONLY ;Пишим таблицу вектаров.
EXPORT __Vectors
__Vectors ;Описываем вектора.
DCD Steck1 ; Значение R13 (Указателя стека).
DCD Reset_Handler ; Адрес переход к основной программе (Вычесляется автоматически).
EXPORT Reset_Handler ;Далее действия при включении.
AREA |.text|, CODE, READONLY ;В памяти кода.
Reset_Handler
main
APBCLK equ 8000000
BAUDRATE equ 9600 ;Скорость передачи.
;--------------------------------------Включаем UART1.----------------------------------------------------
;Настраиваем PA9 (TX - выход).
ldr R1, = RCC_AHB1ENR ;Включение тактирования порта A операцией ИЛИ.
ldr R2, [R1]
ldr R0, = RCC_AHB1ENR_GPIOAEN
orr R0, R2
str R0, [R1]
ldr R1, = GPORT_A_MODER ;Альтернативный режим.
ldr R2, [R1]
ldr R0, = MODER9_10
orr R0, R2
str R0, [R1]
ldr R1, = GPORT_A_OSPEEDR ;Максимальная скорость.
ldr R0, = OSPEEDR9_11
str R0, [R1]
ldr R1, = RCC_APB2ENR ;Включаем тактирование USART операцией ИЛИ.
ldr R2, [R1]
ldr R0, = RCC_APB2ENR_USART1EN
orr R0, R2
str R0, [R1]
ldr R1, = USART1_BRR ;Выставляем скорость USART.
ldr R0, = (APBCLK+BAUDRATE/2)/BAUDRATE;
str R0, [R1]
ldr R2, = USART1_CR1 ;Включаем передатчик и сам USART.
ldr R0, [R2]
ldr R1, = USART_CR1_UE|USART_CR1_TE
orr R0, R1
str R1, [R2]
;Считываем бит TXE (7). Ждем 0.
SR ldr R0, = USART1_SR
ldr R1, [R0]
ldr R0, = USART1_SR_TXE
and R1, R0
cmp R1, R0
bne SR
;Отправляем байт по USART
K ldr R0, =USART1_DR
mov R1, #'L'
str R1, [R0]
b SR
b main
END
END
Во время настройки PA9 возникла проблема. На этом же порту, как оказалось, висел отладчик, а я в коде перезаписал этот порт с одним пином как выход, и отладка зависла. Никак не удавалось включить плату. Не перезагрузка ничего не помогало. Решил проблему с помощью встроенного в плату jtag-а через него стер программу с помощью STM32 ST-LINK Utility . Несколько раз так попадался.