|
|
  |
usart stm32l, Помогите разобраться |
|
|
|
Apr 12 2014, 20:41
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898

|
Добрый день! Неполучается уже второй день запустить USART на STM32L-DISCOVERY Среда Coocox Логическим анализатором смотрю нету ничего... РА 2Tx PA 3Rx КОД: CODE #include "stm32l1xx_gpio.h" #include "stm32l1xx_rcc.h" #include "stm32l1xx.h" #include "misc.h" #include "stm32l1xx_usart.h"
void Usart1_Transmit(uint8_t); //Объявление функции передачи символа через USART void Usart1_Transmit_str(char* str); //Объявление функции передачи строки через USART void usart(void);
void RCC_Configuration(void) { SystemInit(); // Сброс по умолчанию GPIO_DeInit(GPIOA); GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOE);
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIODEN, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOBEN, ENABLE); }
void init_led() { GPIO_InitTypeDef PORT; PORT.GPIO_Pin = (GPIO_Pin_7 | GPIO_Pin_6); PORT.GPIO_Mode = GPIO_Mode_OUT; PORT.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init( GPIOB , &PORT); }
void init_but() { GPIO_InitTypeDef BUTA; BUTA.GPIO_Pin = GPIO_Pin_0; BUTA.GPIO_Mode = GPIO_Mode_IN; BUTA.GPIO_Mode = GPIO_PuPd_NOPULL; BUTA.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init( GPIOA , &BUTA);
GPIO_InitTypeDef BUTD; BUTD.GPIO_Pin = GPIO_Pin_2; BUTD.GPIO_Mode = GPIO_Mode_IN; BUTD.GPIO_Mode = GPIO_PuPd_UP; BUTD.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init( GPIOD , &BUTD); }
void usart() {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Включаем тактирование USART1 GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); //Rx GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); //Tx GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_2); //Настройки будут производится для вывода PA2 TX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //Режим альтернативной функции GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //Выход Push-Pull GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Выход без подтягивающих резисторов GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; //Скорость порта максимальная GPIO_Init(GPIOA, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOА
GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_3); //Настройки будут производится для вывода PA3 //Rx GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //Режим альтернативной функции GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //Режим альтернативной функции GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Выход без подтягивающих резисторов GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; //Скорость порта максимальная GPIO_Init(GPIOA, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOА //Инициализация USART1
USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 9600; //Скорость обмена 9600 бод USART_InitStruct.USART_WordLength = USART_WordLength_8b; //Длина слова 8 бит USART_InitStruct.USART_StopBits = USART_StopBits_1; //1 стоп-бит USART_InitStruct.USART_Parity = USART_Parity_No ; //Без проверки четности USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Без аппаратного контроля USART_InitStruct.USART_Mode = USART_Mode_Tx ; //Включен только передатчик USART1 USART_Init(USART2, &USART_InitStruct); //Заданные настройки сохраняем в регистрах USART1 USART_Cmd(USART2, ENABLE); //Включаем USART1 } void Usart1_Transmit(uint8_t data) { while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи USART2->DR = data; } void Usart1_Transmit_str(char* str) { uint8_t i=0; while(str[i]) { Usart1_Transmit(str[i]); i++; } Usart1_Transmit('n'); Usart1_Transmit('r'); }
int main(void) { RCC_Configuration(); init_led(); init_but(); usart();
int i=0; while(1) { Usart1_Transmit_str('STM32L-DISCOVERY'); //Вызов функции передачи строки через USART for(i=0; i<1000; i++); //Временная задержка }
}
Сообщение отредактировал Dele - Apr 13 2014, 04:31
|
|
|
|
|
Apr 13 2014, 02:29
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 26-11-07
Пользователь №: 32 693

|
while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи USART1->DR = data;
Ждете и настраиваете второго, пишите в первый.
|
|
|
|
|
Apr 13 2014, 04:29
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898

|
Цитата(Timma @ Apr 13 2014, 06:29)  while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи USART1->DR = data;
Ждете и настраиваете второго, пишите в первый. Поправил результат тот же, это я сначала первый пробовал думал там контакты LCD мешают, теперь так же со вторым пробую и так же...
|
|
|
|
|
Apr 13 2014, 04:57
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898

|
Цитата(alexdos @ Apr 13 2014, 08:55)  не вижу включение тактирования альтернативных функций. В самом начале определил тактирование на все порты и Альт. функции в RCC_Configuration(void)
|
|
|
|
|
Apr 13 2014, 05:13
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 26-11-07
Пользователь №: 32 693

|
Если USART настроен только на вывод, зачем подключать пин на ввод? Когда использовали USART1 подключали к APB1 или APB2? Попробуйте включить прерывания по TXE и TC, посмотреть будут ли срабатывать.
|
|
|
|
|
Apr 13 2014, 10:32
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898

|
Пробовал уже без пина на ввод РА3 так же. USART1 тактировал через APB2, USART2 соответственно через APB1, как описано в stm32l1xx_usart.h Я был бы рад кракозябрям, да и их то нету(
А прерывания по USART настраивать это если только самому принимать данные, мне же надо только отправить...
Вообщем заработало! Посмотрел дебагером, в функции Usart1_Transmit_str(char* str) на while(str[i]) отправляет нас в startup_stm32l1xx_md.c а там в бесконечный цикл
static void Default_Handler(void) { /* Go into an infinite loop. */ while (1) { } } Такие вот дела...
|
|
|
|
|
Apr 14 2014, 07:47
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898

|
Планирую дальше организовать радиосвязь между двумя платами STM32DISCOVERY, модуль HOPE RFM22B, приемник выводит через UART в терминал то что пришло от передатчика... чувствую скоро еще тему создам)
Сообщение отредактировал Dele - Apr 14 2014, 07:49
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|