灵动微MM32F003硬件最小系统 --- SWD配置为GPIO
2020-10-28 本文已影响0人
黄开通
MM32F003一共只有20个脚位,当管脚资源紧张的时候,就需要将SWD接口的两个IO口配置成普通GPIO来使用。但是这样一来SWD接口已被用做其他用途,就有无法烧写程序的风险。所以我们会在程序的开头做一个2秒的延时,用来响应SWD的通讯请求。
同时,因为SWD对应管脚已用做其他用途,所以jtag的debug功能也无法使用了。
这个例程会先将SWD的两个IO配置成普通IO,然后再配置成SWD功能。程序有三个重要组成部分:
1 将SWD接口配置成普通IO
void setPA13PA14SWDasPushPullGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_Clock_Set(GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_2); //AF to not pararell
GPIO_PinAFConfig(GPIOA, GPIO_PinSource14, GPIO_AF_2); //AF to not pararell
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //SPI_MOSI | SPI_SCK
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
2 将恢复PA13\PA14的SWD功能
void setPA13PA14asSWD(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_Clock_Set(GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_0); //Set PA13 as SWDIO
GPIO_PinAFConfig(GPIOA, GPIO_PinSource14, GPIO_AF_0); //Set PA14 as SWDCLK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Pull-up input
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3 测试功能
int main(void)
{
uint8_t n;
//--------------------------------------- NOTE ----------------------------------------------
// use the Flywire connet the PA13 or PA14 to LD(LED) pin for watch the LED blink
// the Appliction can be debug, use Flash download to MCU, Push RESET pin or Power-Up the
// Board , MCU run then find the LED blink us 1 Second
//---------------------------------------- End ----------------------------------------------
InitSystick();
delay(2000); //set 2000mS Delay for Debug tools to Capture and Hold the MCU;
GPIO_ConfigInit();
setPA13PA14SWDasPushPullGPIO();
Uart_ConfigInit(9600);
UartSendGroup((u8*)printBuf, sprintf(printBuf, "\r\nsprintf ok\r\n"));
UartSendGroup((u8*)printBuf, sprintf(printBuf, "\r\nStart GPIO from SWD test\r\n"));
UartSendGroup((u8*)printBuf, sprintf(printBuf, "\r\nchange swd to gpio\r\n"));
for(n = 0; n < 20; n++){
GPIO_SetBits( GPIOA, GPIO_Pin_13);
GPIO_SetBits( GPIOA, GPIO_Pin_14); //toggle IO, on/off LED
GPIO_ResetBits( GPIOB, GPIO_Pin_0);
GPIO_SetBits( GPIOB, GPIO_Pin_1); //toggle IO, on/off LED
delay(500);
GPIO_ResetBits( GPIOA, GPIO_Pin_13);
GPIO_ResetBits( GPIOA, GPIO_Pin_14);
GPIO_SetBits( GPIOB, GPIO_Pin_0);
GPIO_ResetBits( GPIOB, GPIO_Pin_1); //toggle IO, on/off LED
delay(500);
}
UartSendGroup((u8*)printBuf, sprintf(printBuf, "\r\nchange gpio to swd\r\n"));
setPA13PA14asSWD(); //let Debug tools re-connect MCU and Erase MCU,
//this function need to move in final application
while(1) {
}
}