一、比较基于寄存器与基于固件库编程方式差异
1.寄存器
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
2.固件库
固件库就是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。固件库函数的作用就是:向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。固件库将寄存器底层操作都封装起来,提供一套API供开发者使用。大多数情况下,不需要知道操作的是哪个寄存器,只需要知道调用哪些函数即可。
二、STM32串口通信
1.实验工具
野火stm32mini,ST-LINK V2 STM8,keil5,野火串口调试助手
2.实验步骤
打开工程文件
设置keil5
修改代码
main.c
#include "stm32f10x.h"
#include "bsp_usart.h"
// 接收缓冲,最大100个字节
uint8_t USART_RX_BUF[100];
// 接收状态标记位
uint16_t USART_RX_FLAG=0;
//串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
uint8_t temp;
//接收中断
if(USART_GetFlagStatus(DEBUG_USARTx, USART_IT_RXNE) != RESET)
{
// 读取接收的数据
temp = USART_ReceiveData(DEBUG_USARTx);
//接收未完成
if((USART_RX_FLAG & 0x8000)==0)
{
//接收到了0x0d
if(USART_RX_FLAG & 0x4000)
{
// 接收错误,重新开始
if(temp != 0x0a) USART_RX_FLAG=0;
// 接收完成
else USART_RX_FLAG |= 0x8000;
}
// 还未接收到0x0d
else
{
if(temp == 0x0d)
{
USART_RX_FLAG |= 0x4000;
}
else
{
USART_RX_BUF[USART_RX_FLAG & 0x3FFF]=temp;
USART_RX_FLAG++;
//接收数据错误,重新开始接收
if(USART_RX_FLAG > 99) USART_RX_FLAG=0;
}
}
}
}
}
int main(void)
{
uint8_t len=0;
uint8_t i=0;
// USART初始化
USART_Config();
while(1)
{
if(USART_RX_FLAG & 0x8000)
{
// 获取接收到的数据长度
len = USART_RX_FLAG & 0x3FFF;
Usart_Sendstr(DEBUG_USARTx, "你发送的消息:\n");
for(i=0; i<len;i++)
{
// 向串口发送数据
USART_SendData(DEBUG_USARTx, USART_RX_BUF[i]);
//等待发送结束
while(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TC)!=SET);
}
Usart_Sendstr(DEBUG_USARTx, "\n\n");
if(strcmp((char *)USART_RX_BUF,"Stop,stm32"