@.CharSet=CP1251
@GNU AS

.syntax unified     @ синтаксис исходного кода
.thumb              @ тип используемых инструкций Thumb
.cpu cortex-m3      @ процессор

@ +-------------------------------------------------------------------------+
@ |                   Пример программы эхоответа по USART1                  |
@ |        микроконтроллер STM32F103C6T, отладочная плата BluePill          |
@ +-------------------------------------------------------------------------+
@ | На контакты PA9 \ PA10 подключить преобразователь USB-UART:             |
@ | PA9  TX - подключить к RXD преобразователя                              |
@ | PA10 RX - подключить к TXD преобразователя                              |
@ |                                                                         |
@ | Настройки USART:                                                        |
@ |    скорость: 9600 бод                                                   |
@ |    размер передачи: 8 бит                                               |
@ |    один стоповый бит, без битов четности                                |
@ |                                                                         |
@ | Отладочный светодиод на PC13 отладочной платы переключает свое состояние|
@ | при получении каждого байта по USART                                    |
@ |                                                                         |
@ | Функциональность программы:                                             |
@ | Отправленный в терминале на компорт символ возвращается обратно         |
@ +-------------------------------------------------------------------------+

.INCLUDE  "/src/inc/rcc.inc"
.INCLUDE  "/src/inc/gpio.inc"
.INCLUDE  "/src/inc/usart.inc"

.section .asmcode

@ основная программа
.global Start
Start:              @ поместите код своей программы ниже
                    BL              SYSCLK72    @ инициализация тактирования

                    @ включим GPIO_C (там находятся пины PC13 - светодиод в обратной полярности)
                    LDR             R0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32
                    MOV             R1, 1
                    STR             R1, [ R0, RCC_APB2ENR_IOPCEN_N * 4 ]

                    @ настроим PС13 - этот светодиод просто будет менять свое состояние посли приема каждого символа
                    LDR             R0, = GPIOC
                    LDR             R1, [ R0, GPIO_CRH ]
                    @ настройка PC13 в режим open drain general purpose
                    LDR             R2, =GPIO_MODE_OUT50 + GPIO_CNF_OUT_OD << 2
                    BFI             R1, R2, GPIO_CRH_MODE13_N, 4
                    STR             R1, [ R0, GPIO_CRH ]

                    @ значение адреса для битбандинка светодиода на PC13
                    ldr r3, =PERIPH_BASE+PERIPH_BB_BASE+(GPIOC_BASE+GPIO_ODR)*32
                    @ зажгем светодиод, у него инверсное включение, поэтому запись 0 - зажигает светодиод
                    MOV             R4, 0
                    STR             R4, [ R3, 13 * 4 ]

                    BL              USART1_INIT    @ инициализация usart1

                    LDR             R0, = USART1

MAIN_LOOP:
                    @ считаем полученный байт
                    BL              USART1_RX_WAIT
                    LDR             R2, [ R0, USART_DR ]

                    @ отправим полученный байт
                    BL              USART1_TX_WAIT
                    STR             R2, [ R0, USART_DR ]

                    @ сменим состояние светодиода
                    CMP             R4, 0
                    ITE             EQ
                    MOVEQ           R4, 1
                    MOVNE           R4, 0
                    STR             R4, [ R3, 13 * 4 ]       @ отобразим новое состояние светодиода

                    B               MAIN_LOOP



