#include "stm32F10x.h"
u8 SMS[]="Hello, my name is STM32F100RB!"; int main(void) {
u32 tmp=0;
RCC->CR|=RCC_CR_HSEON; // Включить генератор HSE. while (!(RCC->CR & RCC_CR_HSERDY)) {} // Ожидание готовности HSE.
RCC->CFGR &=~RCC_CFGR_SW; // Очистить биты SW0, SW1.
RCC->CFGR |= RCC_CFGR_SW_HSE; // Выбрать HSE для тактирования SW0=1.
RCC->APB2ENR|= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта A.
RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций GPIO.
RCC->APB2ENR|= RCC_APB2ENR_USART1EN; // Включение тактирования USART1.
GPIOA->CRH |= GPIO_CRH_MODE9; // Вывод TX PA.9 - на выход.
GPIOA->CRH &=~GPIO_CRH_CNF9; GPIOA->CRH |=GPIO_CRH_CNF9_1; // Альтернативный выход.
USART1->CR1 |=(USART_CR1_RE | USART_CR1_TE); // Разрешить выводы RX, TX - PA10, PA9.
// Скорость 115.2 kbps. USARTDIV=FSYS/(16*baud) = 8e6/(16*115200) = 4,34. USART1->BRR=(4<<4); // Целая часть коэффициента деления USART1.
USART1->BRR|=5; // Дробная часть*16 = 0,34*16 = 5 (окр).
USART1->CR1 |=USART_CR1_UE; // Включение USART1.
while (SMS[tmp]) // Пока не конец строки... { while (!(USART1->SR & USART_SR_TXE)) {} // Ждать освобождения буфера. USART1->DR=SMS[tmp]; tmp++; // Отправить байт. } while (1) { if (USART1->SR & USART_SR_RXNE) USART1->DR=USART1->DR; // Отправить принятый байт. }
}
|