我正在 STM32 世界中迈出第一步,而且非常艰难。我运行我的探索板。当我学会了如何控制 GPIO 并从中中断时,我决定使用 USART。地狱从这里开始。我花了两个晚上在串行通信这样简单的事情上苦苦挣扎!
我有的:
- 配置的 GPIO
- 配置的 USART
- 来自标准 STM 库的时钟 - HSI 48 MHz
- 我在PuTTY中看到字符
- 测试传输参数:8N1 9600和115200
正如您从代码中看到的那样,我希望在得到“_”时看到一个“A”字符。在我看来,这是与波特率有关的东西,但我只得到了这个错误的字符。当我将 BRR 更改为完全错误的值时,它会显示一些垃圾字符。
欢迎任何想法!
#include <stm32f0xx.h>
void putC(uint8_t Character)
{
while(!(USART1->ISR & USART_ISR_TXE))
;
USART1->TDR = Character;
}
int main(void)
{
int i;
RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGCOMPEN;
RCC->AHBENR |= (RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIOAEN);
//ioSetup();
GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10);
GPIOA->MODER |= (GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1);
GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR9 | GPIO_OSPEEDR_OSPEEDR10);
GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR9_0 | GPIO_OSPEEDR_OSPEEDR10_0);
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10);
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR9_0 | GPIO_PUPDR_PUPDR10_0;
GPIOA->AFR[1] |= (0x00000110);
// USART
USART1->BRR = (uint32_t)(48000000/9600); // 9600
//USART1->CR2 = 0;
//USART1->CR3 = 0;
//USART1->GTPR = 0;
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
for (i = 0; i < 0x1000; i++)
__NOP();
i = 0;
for(;;) {
putC('A');
}
return 0;
}