两个使用的角度不同
使用固件库,目前比较多的例程是使用固件库编写的。官方的例子也都采用固件库方式。特点就是简单,易于理解,资料多。如果你没有CortexM系列内核的开发基础,建议从固件库开始玩起。等有一定基础,或是特别需要时再用寄存器。
使用寄存器,想要深入理解CortexM3内核或是需要为了获得更好的可移植性,学习寄存器编程会比较有帮助。但是从专业的角度上看,寄存器更贴近底层,对外设的工作原理和运行机理会有更深的理解。
二、STM32的USART窗口通讯程序 一、准备工作下载CH340驱动
设置波特率为115200,1位停止位,无校验位
使用固件库 在usart\User里新建一个usart,在usart里新建
在usart里新建bsp_usart.h和bsp_usart.c文件
在keil里添加刚刚那两个文件
添加完便可在里面写入代码
魔术棒里将st-link的配置设置 Output勾选Create HEX File
Debug里选择ST-Link
Port选择SW
将图中内容打上勾
发现Debug Adapter里Unit里没有选择
遇上如下问题:
解决方案:st-link驱动安装
下载相应的st-link驱动,64位的选择amd,32位的选择x86
解决方案解决Error:Flash Download failed -“Cortex-M3”问题
二、STM32系统给上位机(win10)发送一个字节的程序main.c
#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_usart.h"int main(void){//初始化串口USART_Config();//发给上位机字节Usart_SendByte(DEBUG_USARTx,100);while (1){}}bsp_usart.h
#ifndef __BSP_USART_H#define __BSP_USART_H#include "stm32f10x.h"//串口1-USART1#define DEBUG_USARTxUSART1#define DEBUG_USART_CLKRCC_APB2Periph_USART1#define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_BAUDRATE115200//USART GPIO 引脚宏定义#define DEBUG_USART_GPIO_CLK(RCC_APB2Periph_GPIOA)#define DEBUG_USART_GPIO_APBxClkCmdRCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORTGPIOA#define DEBUG_USART_TX_GPIO_PINGPIO_Pin_9#define DEBUG_USART_RX_GPIO_PORTGPIOA#define DEBUG_USART_RX_GPIO_PINGPIO_Pin_10#define DEBUG_USART_IRQUSART1_IRQn#define DEBUG_USART_IRQHandler USART1_IRQHandler//初始化串口void USART_Config(void);void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t data);#endif /*__BSP_USART_H */bsp_usart.c
#include "bsp_usart.h"static void NVIC_Configuration(void){ NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; /* 抢断优先级*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 便能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初、始化配置NVIC */ NVIC_Init(&NVIC_InitStructure);}void USART_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Rx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校验位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收发一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, &USART_InitStructure);// 串口中断优先级配置NVIC_Configuration();// 使能串口接收中断USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);// 使能串口USART_Cmd(DEBUG_USARTx, ENABLE); }//发给上位机字节void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t data){//固件库函数SendByteUSART_SendData(pUSARTx,data);while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);}先编译程序,编译成功后,便将程序烧录 连接好电源线,以及我所使用的st-link/v2 连接方式
串口调试助手演示:
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){//接收到了0x0dif(USART_RX_FLAG & 0x4000){// 接收错误,重新开始if(temp != 0x0a) USART_RX_FLAG=0;// 接收完成else USART_RX_FLAG |= 0x8000;}// 还未接收到0x0delse{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