无法使JTDI引脚闪烁

时间:2018-06-19 07:23:00

标签: stm32 gpio jtag

我正在使用STM32F103RCT6来闪烁连接到PA15的LED - PU中的JTDI。

我的GPIO配置就像这样

GPIOA->CRH |= GPIO_CRH_MODE15;      //Output mode, max speed 50 MHz.
GPIOA->CRH &= ~GPIO_CRH_CNF15;      //General purpose output push-pull\

我正试图像这样闪烁

#define LED_HIGH()  (GPIOA->BSRR    |= GPIO_BSRR_BR15)  //LED High
#define LED_LOW()   (GPIOA->BSRR    |= GPIO_BSRR_BS15)  //LED LOW

在数据表中它说

SWJ

要释放GPIO引脚,我们需要使用010或100配置SWJ_CFG [2:0]。所以我正在配置

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;     //((uint32_t)0x02000000) as 010

数据表还说我们需要对ODR / IDR寄存器做一些事情,但我没有弄清楚如何将PA15(或任何JTAG引脚)配置为GPIO。

AFIO_MAPR中的SWJ_CFG为

enter image description here

任何建议都会有所帮助。

提前谢谢

2 个答案:

答案 0 :(得分:2)

请勿忘记启用GPIOAAFIO的时钟。两者都可以在RCC->APB2ENR中启用。只要它们未被启用,寄存器写入就会被忽略。

RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN;

答案 1 :(得分:1)

在你们的帮助下,我得到了答案。

此处的完整代码是使用CMSIS用keil v5编写的

#include "stm32f10x.h"

#define LED_LOW()   (GPIOA->BSRR    |= GPIO_BSRR_BR15)          //Led Low
#define LED_HIGH()  (GPIOA->BSRR    |= GPIO_BSRR_BS15)          //Led High

void GPIO_Init(void);
void Blink_Led(uint16_t ms);
void Delay(uint16_t ms);

int main(void)
{
    GPIO_Init();
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;          //To Free PA15
    while(1)
    {
        Blink_Led(1000);
    }
}

/*Random Delay*/ 
void Delay(uint16_t ms)
{
    for (int i=0;i<ms;i++)
        for (int j=0;j<5120;j++);
}

void Blink_Led(uint16_t ms)
{
    LED_LOW();
    Delay(ms);
    LED_HIGH();
    Delay(ms);
}

void GPIO_Init()
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;     //Clock for Port A - PA15
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;     //ENABLE clock for alternate function

    GPIOA->CRH |= GPIO_CRH_MODE15;      //Output mode, max speed 50 MHz.
    GPIOA->CRH &= ~GPIO_CRH_CNF15;      //General purpose output push-pull
}