РЕШЕНО С 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);
}
}