Всем привет, пытаюсь заставить общаться 2 микроконтроллера через UART, программа для atmega8 очень простая:
#define BAUD 9600
#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)
#include <avr/io.h>
#include <util/delay.h>
void uart_init (void) {
UBRRH = (BAUDRATE >> 8);
UBRRL = BAUDRATE;
UCSRB = (1 << TXEN ) | (1 << RXEN);
UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0) | (1 << UCSZ1);
}
void uart_transmit (uint8_t data) {
while (!( UCSRA & (1 << UDRE)));
UDR = data;
}
int main() {
DDRC = 0xff; PORTC = 0x00;
DDRB = 0xFF; PORTB = 0x00;
DDRD = 0x00; PORTD = 0x00;
uart_init();
while(1) {
uart_transmit('1');
_delay_ms(100);
}
return 0;
}
На STM принимаю через UART2 (порт PA.3) вывожу через USB в терминал, за основу взял вот это: https://github.com/rowol/stm32_discovery_arm_gcc/tree/master/usb_cdc_vcp
Принимать данные с клавиатуры принимает (через терминал) и символы распознает хорошо, помигал светодиодом на плате, но когда пытаюсь передать с atmega8 данные на stm32 получаю вместо символов вопросительные знаки... Что с этим делать не знаю, уже что только не пробовал.
Пробовал конфигурацию которая автоматически создается как в примере выше, и пробовал сам конфигурировать:
RCC_APB2PeriphClockCmd(DISCOVERY_COM_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(DISCOVERY_COM_RX_GPIO_CLK, ENABLE);
GPIO_InitTypeDef gpio;
USART_InitTypeDef usart;
GPIO_StructInit(&gpio);
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Pin = DISCOVERY_COM_TX_PIN;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &gpio);
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Pin = DISCOVERY_COM_RX_PIN;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &gpio);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
USART_StructInit(&usart);
usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
usart.USART_BaudRate = 9600;
usart.USART_WordLength=USART_WordLength_8b;
usart.USART_Parity=USART_Parity_No;
usart.USART_StopBits = USART_StopBits_2;
usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(DISCOVERY_COM, &usart);
USART_ITConfig(DISCOVERY_COM, USART_IT_RXNE, ENABLE);
USART_Cmd(DISCOVERY_COM, ENABLE);
Когда сам конфигурирую вообще ничего не приходит, точнее приходит, но вопросительные знаки не рисуются, но свитодиод мигает, и говорит что данные приходят.
Еще один момент, микроконтроллер atmega работает не от кварцевого резонатора, может быть из-за этого?