上面的代码不用HAL库编写改用寄存配置要怎么修改程序
时间: 2024-04-08 22:30:51 浏览: 10
如果你不想使用 HAL 库,而是想直接使用寄存器配置来编写 STM32 的代码,以下是修改后的示例代码:
```c
#include "stm32f1xx.h"
#include <string.h>
void delay_ms(uint32_t ms)
{
for (volatile uint32_t i = 0; i < ms * 8000; ++i) {}
}
void USART3_Init(void)
{
// 使能 USART3 时钟
RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
// 配置引脚
RCC->APB2ENR |= RCC_APB2ENR_IOPDEN; // 使能 GPIOD 时钟
GPIOD->CRH &= ~GPIO_CRH_CNF10_Msk;
GPIOD->CRH |= GPIO_CRH_CNF10_1; // 复用推挽输出
GPIOD->CRH |= GPIO_CRH_MODE10_0; // 输出模式最大速度 10MHz
// 配置 USART3
USART3->CR1 &= ~USART_CR1_UE; // 关闭 USART3
USART3->CR1 &= ~USART_CR1_M; // 8 位数据位
USART3->BRR = 0x1A0; // 波特率为 115200,APB1 时钟为 36MHz
USART3->CR1 |= USART_CR1_TE; // 使能发送
USART3->CR1 |= USART_CR1_RE; // 使能接收
USART3->CR1 |= USART_CR1_UE; // 打开 USART3
}
void USART3_SendString(const char* str)
{
while (*str != '\0')
{
while (!(USART3->SR & USART_SR_TXE)) {}
USART3->DR = *str++;
}
}
int main(void)
{
// 初始化系统时钟和引脚
SystemInit();
// 初始化 USART3
USART3_Init();
while (1)
{
char buffer[20];
memset(buffer, 0, sizeof(buffer));
// 接收数据
for (int i = 0; i < sizeof(buffer) - 1; ++i)
{
while (!(USART3->SR & USART_SR_RXNE)) {}
buffer[i] = USART3->DR;
if (buffer[i] == '\n')
{
break;
}
}
// 处理数据
if (strcmp(buffer, "Hello from OpenMV!\n") == 0)
{
// 在这里添加你的控制代码,例如驱动电机进行运动
}
delay_ms(100);
}
}
```
这段代码使用寄存器配置来初始化和操作 USART3。你需要根据你的具体硬件配置和需求进行适当的修改和扩展。请注意在初始化时钟和引脚的代码,以及在接收数据时的超时机制等细节。
确保使用正确的寄存器和位字段名称,并根据你的 STM32 型号进行适当的调整。
这个示例只是一个起点,你可能需要根据具体需求来添加其他功能和代码。