Столкнулся с проблемой передачи данных через UART2 (на первом висит отладчик CoLink). Вот исходный код:
CODE
#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);
}
#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).
Кто подскажет, где закралась ошибка?