Всем привет!
Использую плату STM32L053 Discovery с контроллером STM32L053C8T6, и не могу запустить USART. Чтобы не пробовал USART "молчит". Сейчас использую вот такой код, который взял от
сюда и модифицировал под свой контроллер.
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->AHBENR |= RCC_IOPENR_GPIOAEN; //Включаем тактирование порта А
GPIOA->MODER |= 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');
}
На компьютер пробовал передавать используя и FT232 и ST-LINK (оба чипа работают как USART-USB - проверял). Сам контроллер работает, диодами мигает, предустановленная демо-прошивка тоже нормально работала. Не работает ни USART1, ни USART2, пробовал на разных ногах, все время одно и тоже.
В чем может быть проблема? С STM32 раньше не работал, но документацию прочитал уже вдоль и поперек и вроде все правильно.
Сообщение отредактировал IgorKossak - Nov 6 2015, 19:08
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!