Цитата(KnightIgor @ Nov 9 2015, 13:21)

надо перенести в конец инициализации?
Как оказалось, проблема не в этом.
В общем нашел две ошибки, которые исправил и все заработало.
Первая ошибка идиотская. Как я этого раньше не заметил до сих пор не пойму

Clock порта в этом контроллере запускается не в регистре AHBENR, а в регистре IOPENR. Соответственно должно быть не так:
Код
RCC->AHBENR |= RCC_IOPENR_GPIOAEN; //Включаем тактирование порта А
А так:
Код
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; //Включаем тактирование порта А
И вторая.
Нужно было исправить эту строку:
Код
GPIOA->MODER |= GPIO_MODER_MODE9_1; //PA9 - выход AF
Вот так:
Код
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODE9)|(GPIO_MODER_MODE9_1); //PA9 - выход AF
То есть нужно было не просто поместить 1 в 18 бит, а в явном виде поместить 0 в 19 бит, а 1 в 18.
Вторая ошибка оказалось для меня весьма неожиданной. Так как я думал, что все биты по умолчанию нули. Но без этих исправлений у меня ничего не заработало.
P.S. Код с исправлениями:
CODE
#include "stm32l0xx.h" // Device header
void Init(void); //Объявление функции инициализации RCC, GPIO, USART
void Usart1_Transmit(uint8_t); //Объявление функции передачи символа через USART
void Usart1_Transmit_str(char* str); //Объявление функции передачи строки через USART
int main()
{
Init(); //Вызов функции инициализации
while(1)
{
Usart1_Transmit_str("STM32L-DISCOVERY"); //Вызов функции передачи строки через USART
for(uint32_t i=0; i<0x002FFFFF; i++); //Временная задержка
}
}
void Init()
{
//RCC
RCC->CR |= RCC_CR_HSION; //Включаем тактовый генератор HSI
while(!(RCC_CR_HSIRDY)); //Ждем его стабилизации
RCC->CFGR |= RCC_CFGR_SW_HSI; //Выбираем источником тактовой частоты SYSCLK генератор HSI
RCC->CR &= ~RCC_CR_MSION; //Отключаем генератор MSI.
//GPIO
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; //Включаем тактирование порта А
GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODE9)|(GPIO_MODER_MODE9_1); //PA9 - выход AF
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9; //PA9 - выход push-pull
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD9); //PA9 - без подтяжки
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEED9; //PA9 - скорость 40 МГц
/*Далее в разряды AFRH9[3:0] регистра альтернативных функций GPIOA_AFRH записываем
значение 0100, тем самым для вывода PA9 задаем значение
альтернативной функции - AF4, что соответствует USART1_TX*/
GPIOA->AFR[1] |= (0x4<<4);
//USART1
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //Включаем тактирование модуля USART1
USART1->CR1 |= USART_CR1_UE; //Включаем USART1
USART1->CR1 &= ~USART_CR1_M; //Длина слова - 8 бит
USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
USART1->BRR = 0x683; //baud rate 9600 при частоте HSI = 16 МГц
USART1->CR1 |= USART_CR1_TE; //Разрешаем передачу данных
}
//Функци передачи символа через USART
void Usart1_Transmit(uint8_t data)
{
while(!(USART1->ISR & USART_ISR_TC)); //Ждем установки флага TC - завершения передачи
USART1->TDR = data;
}
//Функция передачи строки через USART
void Usart1_Transmit_str(char* str)
{
uint8_t i=0;
while(str[i])
{
Usart1_Transmit(str[i]);
i++;
}
Usart1_Transmit('\n');
Usart1_Transmit('\r');
}