alexsandr-ter 0 18 сентября, 2014 Опубликовано 18 сентября, 2014 (изменено) · Жалоба Уважаемые форумчане! Столкнулся с проблемой передачи данных через 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). Кто подскажет, где закралась ошибка? Изменено 19 сентября, 2014 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
antis 1 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Первое что бросилось в глаза, вместо 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'); Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Уважаемые форумчане! Столкнулся с проблемой передачи данных через UART2 (на первом висит отладчик CoLink). Вот исходный код: На ПК данные не поступаю, не пойму почему. Вроде проверил, ноги должны быть подключены к UART2 (PA2 и PA3). Кто подскажет, где закралась ошибка? RCC_APB2PeriphClockCmd((RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA), ENABLE); И хорошо бы комментарии привести в соответствие с USART2. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexsandr-ter 0 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Все заработало. Единственное, на терминал приходят кракозябры Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Все заработало. Единственное, на терминал приходят кракозябры проверяйте скорость. начинайте с кварца, плл, делителя, установок для uart-а Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sadat 0 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Все заработало. Единственное, на терминал приходят кракозябры Тоже наступал на эти "грабли". Внимательно читаем 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 под свои настройки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexsandr-ter 0 19 сентября, 2014 Опубликовано 19 сентября, 2014 · Жалоба У меня внешний кварц 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). Я так понимаю, что надо прописать где-то частоту кварца, а также прописать на какое число разделить и на какое умножить) Заранее спасибо Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 19 сентября, 2014 Опубликовано 19 сентября, 2014 (изменено) · Жалоба При кварце 8 МГц частота внутренняя будет 24 МГц, а у вас кварц 12 МГц, поэтому комментируйте строку #define SYSCLK_FREQ_24MHz 24000000 и открывайте строку /* #define SYSCLK_FREQ_HSE HSE_VALUE */ и добавьте глобально в проект дефайн HSE_VALUE 12000000. У создателя это уже обсуждалось (пост от Delfer). Изменено 19 сентября, 2014 пользователем Mihey_K Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexsandr-ter 0 22 сентября, 2014 Опубликовано 22 сентября, 2014 · Жалоба Всем спасибо! Проблема решена! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться