我在STM32世界里迈出了第一步,这是相当困难的。我负责我的发现板。当我学会了如何控制GPIO,并被他们打断时,我决定和USART一起玩。地狱开始了。我花了两个晚上都在为像串行通信这样简单的事情而奋斗!
我所拥有的:
正如您可以从代码中看到的那样,我希望在得到“_”时看到'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;
}发布于 2014-11-13 08:44:21
HSI不是一个精确的,也不是一个稳定的时钟。它与温度有很大的误差,在“完美”温度中的频率也不太好。如果这个“错误”值与您计算的值相差几%,那么您可以100%确定问题是HSI的准确性。
你唯一的选择就是使用外部水晶。如果您的“错误”值是您计算的值的倍数(比如2、4、8倍小/大),那么我想您应该仔细看看设置时钟的SystemInit()中的代码。
发布于 2014-11-14 19:25:38
解决方案:来自STM32F0发现板的输出为3.0V。结果证明,对于USBto-RS-232适配器来说,这是不够的。一个由5V提供MAX232的简单电路解决了这个问题。
案子结了。
https://stackoverflow.com/questions/26895939
复制相似问题