Перейти к содержанию
    

Помогите STM32 + UART

Уважаемые форумчане!

 

Столкнулся с проблемой передачи данных через UART2 (на первом висит отладчик CoLink). Вот исходный код:

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"

GPIO_InitTypeDef	GPIO_InitStructA;
GPIO_InitTypeDef	GPIO_InitStructB;
USART_InitTypeDef   USART_InitStruct;
void GPIO_Blink(void);
void InitGPIO(void); //Объявление функции инициализации периферии
void Usart1_Send_symbol(uint8_t); //Объявление функции передачи символа
void Usart1_Send_String(char* str); //Объявление функции передачи строки

char* str;
uint8_t data;


int main(void){
GPIO_Blink();
GPIOB->ODR ^= GPIO_Pin_5;
InitGPIO(); //Вызов функции инициализации периферии
GPIOB->ODR ^= GPIO_Pin_8;
//Передаем строку, сообщающую о готовности микроконтроллера к обмену данными
Usart1_Send_String("Hello, world!");
GPIOB->ODR ^= GPIO_Pin_9;
while(1){
	if((USART2->SR & USART_SR_RXNE)){ //Проверяем поступление данных от компьютера
		data = USART2->DR; //Считываем принятые данные
		Usart1_Send_symbol(data); //И тут же отсылаем их обратно
	 }
	 GPIOB->ODR ^= GPIO_Pin_12;
}
return 0;
}

void InitGPIO(){
//Включаем тактирование GPIOA, USART1 и альтернативных функций AFIO
RCC_APB2PeriphClockCmd((RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA), ENABLE);
//Инициализации вывода PA9 - USART1_Tx
GPIO_InitStructA.GPIO_Pin = GPIO_Pin_2; //Настройки вывода PA9
GPIO_InitStructA.GPIO_Speed = GPIO_Speed_50MHz; //Скорость порта максимальная
GPIO_InitStructA.GPIO_Mode = GPIO_Mode_AF_PP; //Режим альтернативной функции, выход Push-Pull
GPIO_Init(GPIOA, &GPIO_InitStructA); //Заданные настройки сохраняем в регистрах GPIOА
//Инициализации вывода PA10 - USART1_Rx
GPIO_InitStructA.GPIO_Pin = GPIO_Pin_3; //Настройки вывода PA10
GPIO_InitStructA.GPIO_Mode  = GPIO_Mode_IN_FLOATING; //Input floating
GPIO_Init(GPIOA, &GPIO_InitStructA); //Заданные настройки сохраняем в регистрах GPIOА
//Инициализация USART1
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_Rx | USART_Mode_Tx; //Включен передатчик и приемник USART1
USART_Init(USART2, &USART_InitStruct); //Заданные настройки сохраняем в регистрах USART1
USART_Cmd(USART2, ENABLE); //Включаем USART1
}
//Функция передачи символа
void Usart1_Send_symbol(uint8_t data){
while(!(USART2->SR & USART_SR_TC)); //Проверяем установку флага TC - завершения предыдущей передачи
USART2->DR = data; //Записываем значение в регистр данных - передаем символ
}
//Функция передачи строки через USART
void Usart1_Send_String(char* str){
uint8_t i=0;
while(str[i]){
	Usart1_Send_symbol(str[i]);
	i++;
}
Usart1_Send_symbol('n');
Usart1_Send_symbol('r');
}
void GPIO_Blink(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   // Configure the GPIO_LED pin
GPIO_InitStructB.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12;;
GPIO_InitStructB.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructB);
}

 

На ПК данные не поступаю, не пойму почему.

Вроде проверил, ноги должны быть подключены к UART2 (PA2 и PA3).

Кто подскажет, где закралась ошибка?

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первое что бросилось в глаза, вместо

RCC_APB2PeriphClockCmd((RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA), ENABLE);

должно быть

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA), ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

 

вместо

Usart1_Send_symbol('n');

Usart1_Send_symbol('r');

 

надо

Usart1_Send_symbol('\n');

Usart1_Send_symbol('\r');

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые форумчане!

 

Столкнулся с проблемой передачи данных через UART2 (на первом висит отладчик CoLink). Вот исходный код:

 

На ПК данные не поступаю, не пойму почему.

Вроде проверил, ноги должны быть подключены к UART2 (PA2 и PA3).

Кто подскажет, где закралась ошибка?

RCC_APB2PeriphClockCmd((RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA), ENABLE);

 

И хорошо бы комментарии привести в соответствие с USART2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все заработало. Единственное, на терминал приходят кракозябры

 

проверяйте скорость. начинайте с кварца, плл, делителя, установок для uart-а

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все заработало. Единственное, на терминал приходят кракозябры

Тоже наступал на эти "грабли". Внимательно читаем system_stm32f2xx.c: (аналогично и для 103 серии)

 

" 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define

* in "stm32f2xx.h" file. When HSE is used as system clock source, directly or

* through PLL, and you are using different crystal you have to adapt the HSE

* value to your own configuration.

"

Корректируем HSE_VALUE под свои настройки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня внешний кварц 12МГц. Что-то я не пойму где и что менять.

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000

У меня stm32f103c8t6 (плата Pinboard 2).

Я так понимаю, что надо прописать где-то частоту кварца, а также прописать на какое число разделить и на какое умножить) Заранее спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При кварце 8 МГц частота внутренняя будет 24 МГц, а у вас кварц 12 МГц, поэтому комментируйте строку

#define SYSCLK_FREQ_24MHz  24000000

и открывайте строку

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */

и добавьте глобально в проект дефайн HSE_VALUE 12000000.

У создателя это уже обсуждалось (пост от Delfer).

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...