灵动微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) {

    }
}
上一篇下一篇

猜你喜欢

热点阅读