使用STLINK进行程序调试
通过串口来调试程序,每一次改动都要重新烧录到单片机,这样不仅不灵活,而且单片机的烧录次数是有限的,这样会影响到单片机的寿命。简单的程序可以拿串口来这样玩,但复杂的这样玩就太累了。通过查阅一些资料和各位博主的指点,学会了通过STLINK进行硬件连接后在线调试。用STLINK来调试可以真实访问查看寄存器的变化,下面就以串口输出内容到上位机显示为例,讲述一下如何用STLINK来调试程序。
- 安装STLINK驱动程序。因本例程需要用到串口将内容输出到上位机,我的板子采用芯片CH340将USB转串口,所以要安装CH340 驱动。
- 建立工程,将如图文件包含到工程里
- Options for Target 选项卡在 Debug 栏选择仿真工为具 Use:ST-Link Debugger,如图依次 成4个步骤
然后点击Settting进行STLINK参数设置,我选用SW模式,JTAG占用比较多的I/O,容易影响其他外设的使用,速率不要选择太大,否则会出现问题。
接下来我们还需要在 Utilities 选项卡里面设置下载时的目标编程器
我们直接勾选 Use Debug Driver,即和调试一样,选择 ST LINK 来给目标器件的 FLASH 编程,然后点击 Settings 按钮,进入 FLASH 算法设置
这里 MDK5 会根据我们新建工程时选择的目标器件,自动设置 flash 算法。我使用的是STM32F103RCT6,FLASH 容量为 256K 字节,属于高容量系列,所以 Programming Algorithm里面默认会有 512K 型号的 STM32F10x High-density Flash 算法(注意:256K 和 512K 共用)。另外,如果这里没有 flash 算法,大家可以点击 Add 按钮,自行添加即可。最后选中 Reset and Run
选项,以实现在编程后自动启动,其他默认设置即可。 - 设置好后编写程序
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=9600;
USART_InitStruct.USART_WordLength=USART_WordLength_8b ;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_Mode=USART_Mode_Tx |USART_Mode_Rx;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStruct);
USART_Cmd(USART1, ENABLE);
}
//---------´ò¿ªÏàÓ¦ÍâÉèʱÖÓ--------------------
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); //ʹÄÜAPB2ÍâÉèµÄGPIOAµÄʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //ʹÄÜUSARTʱÖÓ
}
void Delay_Ms(u16 time) //ÑÓʱº¯Êý
{
u16 i,j;
for(i=0;i<time;i++)
for(j=10000;j>0;j--);
}
int main(void)
{
u8 i,data;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
data='A';
for(i=0;i<30;i++)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,data);
data++;
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
return(0);
}
接下来将硬件连接,下载后就点击Debug后就可以实时跟踪程序,很方便的找到程序的bug。