STM32可以通过串口、JTAG和SWD口进行烧写和调试。
一些概念
盗版JLINK不能进行固件升级!盗版JLINK不能进行固件升级!盗版JLINK不能进行固件升级!
通过串口烧写: 在系统内部存在一片bootloader,类似单片机的ISP系统。可以通过设置BOOT引脚使系统上电后进入bootloader。如果在bootloader中预先写好相应的程序,即可通过串口将固件输入给bootloader,再由bootloader写入FLASH,完成在线串口烧写。一般开发板上BOOT引脚会接在串口的DTR和RTS引脚上,方便串口工具进行烧写和重启。
重定向输出函数:在库函数中有printf();函数,默认功能是在显示器上回显调试信息。该指令可以方便的输出字符串、符号和各种数据类型。printf()函数默认是调用int fputc(int ch, FILE *f)函数进行输出的。可以通过重定义fputc()函数使输出重定向到串口上。
串口的使用
STM32的串口:
STM32-M3共有4个串口:USART1-USART4。
初始化结构体:
USART_InitStructure.USART_BaudRate = bound;//波特率9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据长度8bit
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位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; //发送、接收模式
控制结构体:
typedef struct
{
__IO uint16_t SR; //状态寄存器
uint16_t RESERVED0;
__IO uint16_t DR; //数据缓存寄存器,读、写实际上分别是两个寄存器
uint16_t RESERVED1;
__IO uint16_t BRR; //波特率设置寄存器
uint16_t RESERVED2;
__IO uint16_t CR1; //控制寄存器1
uint16_t RESERVED3;
__IO uint16_t CR2; //控制寄存器2
uint16_t RESERVED4;
__IO uint16_t CR3; //控制寄存器3
uint16_t RESERVED5;
__IO uint16_t GTPR; //保护时间和预分频寄存器
uint16_t RESERVED6;
} USART_TypeDef;
实际上每个变量就是一个寄存器的。写入、读取SR,或者DR,实际上就是制作操作寄存器。
#define USART1 ((USART_TypeDef *) USART1_BASE)
由此可知,实际上这个控制结构体里的每个变量,都指向控制寄存器的实际地址。
操作函数:
USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);//初始化函数
USART_DeInit(USART_TypeDef* USARTx);//串口复位
USART_SendData(USART_TypeDef* USARTx, uint16_t Data);//发送数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);//读取数据
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);//读取状态
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState);//中断设置函数
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);//中断状态获取函数