У меня точно такая же проблема, я решил не создавать новую тему.
Код:
int main()
{
unsigned char led = 0;
init_clock();
init_led();
led_set(0);
init_usart();
usart_tx("", 0);
usart_tx("=====", 5);
while(1)
{
led_set(led);
led++;
if(led > 7) led = 0;
usart_tx_byte(0x30 + led);
delay_ms(100);
}
}
А вот код настройки. У меня есть отладочная плата от LDM, так вот на ней от кварца 8 МГц на тактовой 80 МГц код UART работал отлично, и задержки мигания светодиодов вначале ровно секунда (по осциллу видно). Так вот в новой версии вижу те же задержки. У меня кварц на своей плате 16 МГц, так я поставил RST_CLK_CPU_PLLsrcHSEdiv2 RST_CLK_CPU_PLLmul10 делим на 2 и умножаем на 10 - вот наши 80 МГц снова.

Открыть "инициализация..."
Код:
void init_led()
{
MDR_PORTB->OE = 0x0000000F;
MDR_PORTB->FUNC = 0x00000000;
MDR_PORTB->ANALOG = 0x0000FFFF;
MDR_PORTB->PULL = 0x0F;
MDR_PORTB->PD = ~(0x0F);
MDR_PORTB->PWR = 0x55555555;
MDR_PORTB->GFEN = 0;
MDR_PORTB->RXTX = 0x0000;
}
void led_set(unsigned char value)
{
int i;
for(i = 0; i < 3; i++)
{
if(value & (1<<i)) MDR_PORTB->RXTX |= (1<<(i + 1));
else MDR_PORTB->RXTX &= ~(1<<(i + 1));
}
}
void init_usart()
{
PORT_InitTypeDef port;
UART_InitTypeDef usart;
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB, ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_UART1, ENABLE);
UART_BRGInit(MDR_UART1, UART_HCLKdiv1);
PORT_StructInit(&port);
port.PORT_PULL_UP = PORT_PULL_UP_OFF;
port.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
port.PORT_PD_SHM = PORT_PD_SHM_OFF;
port.PORT_PD = PORT_PD_DRIVER;
port.PORT_GFEN = PORT_GFEN_OFF;
port.PORT_FUNC = PORT_FUNC_ALTER;
port.PORT_SPEED = PORT_SPEED_MAXFAST;
port.PORT_MODE = PORT_MODE_DIGITAL;
port.PORT_OE = PORT_OE_OUT;
port.PORT_Pin = PORT_Pin_5;
PORT_Init(MDR_PORTB, &port);
port.PORT_OE = PORT_OE_IN;
port.PORT_Pin = PORT_Pin_6;
PORT_Init(MDR_PORTB, &port);
usart.UART_BaudRate = 9600;
usart.UART_WordLength = UART_WordLength8b;
usart.UART_StopBits = UART_StopBits1;
usart.UART_Parity = UART_Parity_No;
//usart.UART_FIFOMode = UART_FIFO_ON;
usart.UART_FIFOMode = UART_FIFO_OFF;
usart.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;
//usart.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_Init(MDR_UART1, &usart);
UART_Cmd(MDR_UART1, ENABLE);
}
unsigned char usart_receive(char *ok)
{
char timeout = 100;
*ok = 0;
while((!(MDR_UART1->FR & (1<<6))) && (timeout > 0))
{
delay_10us(1);
timeout--;
}
if(timeout > 0)
{
*ok = 1;
return (MDR_UART1->DR & 0xFF);
}
return 0;
}
void usart_tx_byte(const char data)
{
while(!(MDR_UART1->FR & (1UL << 7)));
MDR_UART1->DR = (data & 0xFF);
}
void uart_tx_buffer(unsigned char *buf, unsigned char size)
{
unsigned char i = 0;
for(i = 0; i < size; i++)
{
usart_tx_byte(buf[i]);
}
}
void usart_t(char *str, int len)
{
int i;
for(i = 0; i < len; i++) usart_tx_byte(str[i]);
}
void usart_tx(char *str, int len)
{
int i;
for(i = 0; i < len; i++) usart_tx_byte(str[i]);
usart_tx_byte(0x0D);
usart_tx_byte(0x0A);
}
void init_clock()
{
NVIC->ICPR[0] = 0xFFFFFFFF;
NVIC->ICER[0] = 0xFFFFFFFF;
MDR_DMA->CHNL_REQ_MASK_CLR = 0xFFFFFFFF;
MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF;
RST_CLK_HSEconfig(RST_CLK_HSE_ON);
while(RST_CLK_HSEstatus() != SUCCESS);
//!!!RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul10);
RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv2, RST_CLK_CPU_PLLmul10); // quartz 16 MHz
RST_CLK_CPU_PLLcmd(ENABLE);
if(RST_CLK_CPU_PLLstatus() == ERROR) while(1);
RST_CLK_PCLKcmd(RST_CLK_PCLK_EEPROM, ENABLE);
RST_CLK_CPU_PLLuse(ENABLE);
RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);
RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);
RST_CLK_PCLKcmd(RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_SSP2, ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB, ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTF, ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE);
}

Закрыть
Тем не менее на любых скоростях, пробовал 115200, 57600, 9600 - везде по осциллографу вижу биты правильные при посылке (перед UART->USB-UART), но скорость неверная. Для 9600 она в 2.25 раза выше, судите сами: на картинке осциллограмма (шум не знаю откуда, не должен мешать, на питании такого не вижу).
Тут где-то 46 мкс на бит: 1÷(46×10^−6) = 21739 = 2,26 * 9600.
Разумеется комп принимает мусор:
подозреваю аппаратную ошибку, либо ошибку в библиотеке, которая считает эти делители. Я так понимаю, библиотека сама видит настройки делителей и подстраивает под мои usart.UART_BaudRate = 9600;
Прошу помощи, не знаю как отладить, у мну нету JTAG, я вообще-то на этот UART полагался

Когда я пробовал перекинуться на UART по которому шьюсь, кажется была такая же проблема - байты шли, но билибердовые. Только я тогда не догадался осциллом смотреть.