ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
562678
rod-i-on (27.11.2014 23:53 - 29.11.2014 00:55, просмотров: 2848) MBedder
РЕШЕНО С USART валится ерунда. Не могу понять почему. Не скорость и не настройки. Посоветуйте, пожалуйста, куда копать 
Решение: Внешний кварц в программе стоял 8МГц, а по факту 16 МГц. Всем спасибо за поддержку
Проц STM32F051R8, IAR, пишу при помощи либ. Собственно, переделал пример от ST под свою плату. USART2 + FTDI. Прерывание по приходу байта в UART. В прерывании принятый байт возвращаю обратно. При запуске программы должно прийти HI THERE 55, а приходит B...t.1 На отправку символов возвращает вот что. Здесь первый символ в строке - ввод, второй ответ. Точка в конце - это не \r или \n.
qq. ww. eu. rr. tt. yq. uu. ia og pp. [S. ]U. aq. ss. dt. fv. gw. .h` jb kc ld ;3. '7. zr. xp. cs. vv. br. nf me ,$ .& /'
Обратите внимание: e->u d->t f->v и прочие. Почему??! Код main /* Includes ------------------------------------------------------------------*/ #include "main.h" #include <stdio.h> #include <stdlib.h> /* Private function prototypes -----------------------------------------------*/ static void USART_Config(void); static void NVIC_Config(void); int main(void){ /* NVIC configuration */ NVIC_Config(); /* USART configuration */ USART_Config(); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /* Infinite loop */ printf("HI THERE %i\r\n", 55); while (1){ } } static void NVIC_Config(void){ NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USART Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } static void USART_Config(void){ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART2_Init(&USART_InitStructure); } int putchar(int c){ // Place your implementation of fputc here e.g. write a character to the USART USART_SendData(USART2, (uint8_t)c); // Loop until the end of transmission while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {} return c; } void USART2_Init(USART_InitTypeDef* USART_InitStruct){ GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIO clock */ RCC_AHBPeriphClockCmd(EVAL_COM1_TX_GPIO_CLK | EVAL_COM1_RX_GPIO_CLK, ENABLE); /* Enable USART clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* Connect PXx to USARTx_Tx */ GPIO_PinAFConfig(EVAL_COM1_TX_GPIO_PORT, EVAL_COM1_TX_SOURCE, EVAL_COM1_TX_AF); /* Connect PXx to USARTx_Rx */ GPIO_PinAFConfig(EVAL_COM1_RX_GPIO_PORT, EVAL_COM1_RX_SOURCE, EVAL_COM1_RX_AF); /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = EVAL_COM1_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(EVAL_COM1_TX_GPIO_PORT, &GPIO_InitStructure); /* Configure USART Rx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = EVAL_COM1_RX_PIN; GPIO_Init(EVAL_COM1_RX_GPIO_PORT, &GPIO_InitStructure); /* USART configuration */ USART_Init(USART2, USART_InitStruct); /* Enable USART */ USART_Cmd(USART2, ENABLE); } Прерывание void USART2_IRQHandler(void){ unsigned char data; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ data = (char)(USART_ReceiveData(USART2) & 0x7F); USART_SendData(USART2, (char)data); } }