美文网首页
灵动微MM32F003硬件最小系统 --- SWD配置为GPIO

灵动微MM32F003硬件最小系统 --- SWD配置为GPIO

作者: 黄开通 | 来源:发表于2020-10-28 15:00 被阅读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) {
    
        }
    }
    

    相关文章

      网友评论

          本文标题:灵动微MM32F003硬件最小系统 --- SWD配置为GPIO

          本文链接:https://www.haomeiwen.com/subject/glzqvktx.html