你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f030f4p6 锁死的现象谁遇到过?

[复制链接]
sunke9 提问时间:2017-12-2 17:22 /
我做了一个小电路,根据stm32f030f4p6的PA4、PA5、PA6、PA7的输入状态决定从串口写不同的内容。
结果这个程序编完只要用stlinkV2写到CPU里面,stlink就再也连不上CPU了,CPU自己也不工作了,哪位大侠给指点一下问题出在什么地方。
电路.png
收藏 评论13 发布时间:2017-12-2 17:22

举报

13个回答
五哥1 回答时间:2017-12-10 02:08:55
看下手册,PA14,PA15应当配置为SWD了。
maxtch 回答时间:2017-12-2 18:07:15
首先,把复位线接出来。芯片是可以在复位的状态下被擦除的,程序不启动不会关闭 SWD。然后,在 Cube 里面选管脚功能的时候,默认别忘了打开 SWD 或 JTAG 脚,否则程序运行起来后 SWD 就不能用了。

如果你需要一个小体积 JTAG 或 SWD 接口,可以参考 ARM 的 1.27 间距 CMSIS-DAP 接口,4 线 JTAG 和复位都有接出来的。

评分

参与人数 2ST金币 +4 收起 理由
zero99 + 2
MrJiu + 2 很给力!

查看全部评分

sunke9 回答时间:2017-12-2 20:26:33
maxtch 发表于 2017-12-2 18:07
首先,把复位线接出来。芯片是可以在复位的状态下被擦除的,程序不启动不会关闭 SWD。然后,在 Cube 里面选 ...

用什么命令可能会关闭SWD呢,我的程序里面一共就用了5个io和1个串口,我的程序也就是初始化一下这5个IO和串口
这程序全贴出来也没多少行啊
sunke9 回答时间:2017-12-2 20:27:30
什么样的操作会关闭SWD呢?我这里面一共就用了5个io和1个串口,我的程序也就是初始化一下这5个IO和串口
sunke9 回答时间:2017-12-2 20:40:08

/* Includes ------------------------------------------------------------------*/
//#include "main.h"
#include "stm32f0xx.h"
#include "initialize.h"

/* Private typedef -----------------------------------------------------------*/
char count = 0;
/* Private define ------------------------------------------------------------*/
uint8_t        ID0[10]        ={0xEB,0x90,0x04,0x55,0x00,0x00,0x00,0xBD,0x52};
uint8_t        ID1[10]        ={0xEB,0x90,0x04,0x55,0x01,0x00,0x00,0xEC,0x92};
uint8_t        ID2[10]        ={0xEB,0x90,0x04,0x55,0x02,0x00,0x00,0x1C,0x52};
uint8_t        ID3[10]        ={0xEB,0x90,0x04,0x55,0x03,0x00,0x00,0x4D,0x52};
uint8_t        ID4[10]        ={0xEB,0x90,0x04,0x55,0x04,0x00,0x00,0xFC,0x93};
uint8_t        ID5[10]        ={0xEB,0x90,0x04,0x55,0x05,0x00,0x00,0xAD,0x53};
uint8_t        ID6[10]        ={0xEB,0x90,0x04,0x55,0x06,0x00,0x00,0x5D,0x53};
uint8_t        ID7[10]        ={0xEB,0x90,0x04,0x55,0x07,0x00,0x00,0x0C,0x93};
uint8_t        ID8[10]        ={0xEB,0x90,0x04,0x55,0x08,0x00,0x00,0x3C,0x90};
uint8_t        ID9[10]        ={0xEB,0x90,0x04,0x55,0x09,0x00,0x00,0x6D,0x50};

    uint16_t temp;

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Delay_us(__IO uint32_t nCount);
void Delay_ms(__IO uint32_t nCount);
void USART1_TX_Data(uint8_t *pData,uint16_t TX_NumByte);

/* Private functions ---------------------------------------------------------*/

/******************************************************************************
* Function Name          : main
* Description            : 主程序
* Input                  : None
* Output                 : None
* Return                                        : None
* Attention                                : None
******************************************************************************/
int main(void)
{
        System_InitConfig();
        Delay_ms(500);
       

    while (1)
        {
        temp = GPIO_ReadInputData(GPIOA);
        temp = temp & 0x00f0;
        temp = temp >> 4;
        switch(temp)
        {
            case  0:{ USART1_TX_Data(ID0,9);}break;//USART打印输出       
            case  1:{ USART1_TX_Data(ID1,9);}break;
            case  2:{ USART1_TX_Data(ID2,9);}break;
            case  3:{ USART1_TX_Data(ID3,9);}break;
            case  4:{ USART1_TX_Data(ID4,9);}break;
            case  5:{ USART1_TX_Data(ID5,9);}break;
            case  6:{ USART1_TX_Data(ID6,9);}break;
            case  7:{ USART1_TX_Data(ID7,9);}break;
            case  8:{ USART1_TX_Data(ID8,9);}break;
            case  9:{ USART1_TX_Data(ID9,9);}break;
        
        }        

        if(GPIO_ReadOutputDataBit(GPIOA, LED))
        {GPIO_ResetBits(GPIOA, LED);}
        else
        {GPIO_SetBits(GPIOA, LED);}
    /* 延迟100mS        */
        Delay_ms(100);
  }
}

/******************************************************************************
* Function Name          : Delay | Delay_us
* Description            : 延迟程序
* Input                  : nCount: 延时长度
* Output                 : None
* Return                                        : None
* Attention                                : None
******************************************************************************/
void Delay(__IO uint32_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
                nCount--;
  }
}
void Delay_us(__IO uint32_t nCount)
{
  /* 10uS延迟=>10.8uS,100uS延迟=>104uS*/
  while (nCount != 0)
  {
        nCount--;  
        Delay(10);
  }
}
void Delay_ms(__IO uint32_t nCount)
{
  /* 10uS延迟=>10.8uS,100uS延迟=>104uS*/
  while (nCount != 0)
  {
        nCount--;  
        Delay(11000);
  }
}

/******************************************************************************
* Function Name          : USART1_TX_Data
* Description            : USART1数据发送
* Input                  : -pData:USART1发送数据
                                                                                -TX_NumByte:发送数据数
* Output                 : None
* Return                                        : None
* Attention                                : None
******************************************************************************/
void USART1_TX_Data(uint8_t *pData,uint16_t TX_NumByte)
{
        uint16_t i;
        for(i=0;i<TX_NumByte;i++)       
                {
                USART_SendData(USART1,*pData++);

                #if(USART1_BaudRate==115200)               
                Delay_us(90);
                #endif
               
                #if(USART1_BaudRate==19200)               
                Delay_us(500);
                #endif
               
                #if(USART1_BaudRate==9600)
                Delay_us(1000);
                #endif
                }//for
}//void

/******************************************************************************
* Function Name          : USART1_IRQHandler
* Description            : USART1中断接收
* Input                  : None
* Output                 : None
* Return                                        : None
* Attention                                : None
******************************************************************************/
void USART1_IRQHandler(void)
{
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                USART_SendData(USART1,USART_ReceiveData(USART1));//读取UART1接收到的数据并输出
        }
}
sunke9 回答时间:2017-12-2 20:40:41
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __initialize_H
#define __initialize_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"

/* Exported functions --------------------------------------------------------*/
//extern uint16_t USART1_BaudRate;
uint32_t USART1_BaudRate = 115200;
#define CON1       GPIO_Pin_4
#define CON2       GPIO_Pin_5
#define CON3       GPIO_Pin_6
#define CON4       GPIO_Pin_7

#define LED        GPIO_Pin_3

/******************************************************************************
* Function Name          : GPIO_InitConfig
* Description            : GPIO配置
* Input                  : None
* Output                 : None
* Return                                        : None
* Attention                                : None
******************************************************************************/
void GPIO_InitConfig(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
        
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_1;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
      

    GPIO_InitStruct.GPIO_Pin = CON1 | CON2 | CON3 | CON4;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;  
    GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;
    GPIO_Init(GPIOA, &GPIO_InitStruct);  
}

/******************************************************************************
* Function Name          : USART_InitConfig
* Description            : USART配置
* Input                  : None
* Output                 : None
* Return                                        : None
* Attention                                : None
******************************************************************************/
void USART_InitConfig(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
       
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);       
  /*
  *  USART1_TX -> PA9 , USART1_RX ->        PA10
  */                               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        USART_InitStructure.USART_BaudRate = USART1_BaudRate;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);

        USART_Cmd(USART1, ENABLE);
       
        //USART_DirectionModeCmd(USART1, USART_Mode_Rx, ENABLE);       
        //USART_RequestCmd(USART1,USART_Request_RXFRQ,ENABLE);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

  /*Enable the USART1 Interrupt(使能USART1中断)*/                                                                                                        
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPriority = 4;                
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/******************************************************************************
* Function Name          : System_InitConfig
* Description            : 系统配置
* Input                  : None
* Output                 : None
* Return                        : None
* Attention                        : None
******************************************************************************/
void System_InitConfig(void)
{
        //PLL_InitConfig();       
        GPIO_InitConfig();
        USART_InitConfig();
}


#endif
sunke9 回答时间:2017-12-2 20:41:27
我这程序全贴上来也没几行啊,没看出来哪里禁用了SWD呢
maxtch 回答时间:2017-12-2 22:31:40
你在 Cube 里面是怎么设置的?有没有打开 SWD?Cube 默认上电会关 SWD 的。(这也是为什么我不用,也不喜欢用 Cube 这类代码生成器。你搞不清楚生成的代码干了什么,每次去读还都不一样。)

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

sunke9 回答时间:2017-12-3 08:36:17
maxtch 发表于 2017-12-2 22:31
你在 Cube 里面是怎么设置的?有没有打开 SWD?Cube 默认上电会关 SWD 的。(这也是为什么我不用,也不喜欢 ...

我这里没用代码生成器,用的是厂家的固件库。
maxtch 回答时间:2017-12-3 12:26:30
你可以尝试一下手动声明 SWD 管脚。
sunke9 回答时间:2017-12-3 14:06:44
maxtch 发表于 2017-12-2 22:31
你在 Cube 里面是怎么设置的?有没有打开 SWD?Cube 默认上电会关 SWD 的。(这也是为什么我不用,也不喜欢 ...

你说的 Cube是厂家的固件库吗?
maxtch 回答时间:2017-12-3 15:35:36
sunke9 发表于 2017-12-3 14:06
你说的 Cube是厂家的固件库吗?

Cube 和 SPL 都是。
sunke9 回答时间:2018-4-22 11:43:06
五哥1 发表于 2017-12-10 02:08
看下手册,PA14,PA15应当配置为SWD了。

楼上正解!后来发现是这样的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版