打印
[STM32F1]

STM32F103 崩溃之道

[复制链接]
4749|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OIU|  楼主 | 2021-7-14 17:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define   SETSCL()                     (PAout(4) = 1) //output push-pull
#define   CLRSCL()                     (PAout(4) = 0)

#define   SETSDA()                    (PAout(5) = 1) //output push-pull
#define   CLRSDA()                    (PAout(5) = 0)
#define   CHECKSDA()                (PAin(6))    //input
void Delay10us(unsigned int dly)
{
        while(dly--);
        {
        }
}

void IICStart(void)
{
          uint8 i;
       
         for(i = 0; i < 2; i++)
                 Delay10us(100);       
               
   SETSDA();
        i = 100;
        while(i--);
        SETSCL();
        i = 100;
        while(i--);       
        CLRSDA();
        Delay10us(5);
        CLRSCL();
        Delay10us(5);       
}
main()
{
      IICStart(); // ok
    ...
IICStart();//  always collapse . change A port to B,c ,d ,e  .ok

}
//  ?????

使用特权

评论回复
沙发
自己造声卡| | 2021-7-14 17:31 | 只看该作者
这个里面增加这么多的delay哈哈,不崩溃,就怪了。

使用特权

评论回复
板凳
diweo| | 2021-7-15 08:42 | 只看该作者
用逻辑分析仪抓波形来分析

使用特权

评论回复
地板
OIU|  楼主 | 2021-7-15 08:52 | 只看该作者
不加delay 也是一样的。在线debug模式clrscl ,clrsda, setscl, setsda,连续动作几次就over了。

使用特权

评论回复
5
OIU|  楼主 | 2021-7-15 08:54 | 只看该作者
换了几个f103vc, f103ve,等等都是一样。st的难做,比nxp的差距太远了。

使用特权

评论回复
6
小叶三千| | 2021-7-15 08:55 | 只看该作者
查一下IIC硬件接口

使用特权

评论回复
7
OIU|  楼主 | 2021-7-15 08:59 | 只看该作者
接口断开,不连接任何东西,直接使用就game over. 可以不加任何东西,就上面短短的几行代码就崩溃。

使用特权

评论回复
8
呐咯密密| | 2021-7-15 09:46 | 只看该作者
ST的硬件IIC我就搞定过一次F030.其他的都失败了

使用特权

评论回复
9
fubeining| | 2021-7-15 10:16 | 只看该作者
检查下你的宏定义,F103肯定可以,找代码问题。 我的应用中有时钟,电容触摸屏都有用到IIC,而且是用的模拟IO实现的。肯定是可以的。

使用特权

评论回复
10
OIU|  楼主 | 2021-7-15 11:28 | 只看该作者



////////////////////////////////////////////////////////////
/*
#define   SETSCL()                     (PAout(4) = 1)
#define   CLRSCL()                     (PAout(4) = 0)

#define   SETSDA()                    (PAout(5) = 1)  
#define   CLRSDA()                    (PAout(5) = 0)
#define   CHECKSDA()                (PAin(6))

*/

#define   SETSCL()                     (GPIO_SetBits(GPIOA, GPIO_Pin_4))
#define   CLRSCL()                     (GPIO_ResetBits(GPIOA, GPIO_Pin_4))
//#define   CHECKSCL()                 (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4))

#define   SETSDA()                    (GPIO_SetBits(GPIOA, GPIO_Pin_5))                    
#define   CLRSDA()                    (GPIO_ResetBits(GPIOA, GPIO_Pin_5))
//#define   CHECKSDA()                (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))



void Delay10us(unsigned int dly)
{

        while(dly--);
                {
                }
}

void IICStart(void)
{
          uint8 i;
       
         for(i = 0; i < 2; i++)
                 Delay10us(100);       
               
   SETSDA();
        //i = 100;
        //while(i--);
        SETSCL();
        //i = 100;
        //while(i--);       
        CLRSDA();
        //Delay10us(5);
        CLRSCL();
        //Delay10us(5);       
       
}


void GPIOInit(void)
{
        RCC->APB2ENR|=BIT2; //port A clock enable

        //iic gpio
        GPIOA->CRL &= 0XFF00FFFF;
        GPIOA->CRL|=0X00330000;
    GPIOA->ODR|=(BIT4 | BIT5);


        GPIOA->CRL &= 0XF0FFFFFF;
        GPIOA->CRL|=0X08000000;

       

        RCC->APB2ENR|=1<<5;                    //port D clock enable
        GPIOD->CRH &= 0XFFFFF00F;
        GPIOD->CRH|=0X00000330;
    GPIOD->ODR|=1<<5;
   
       
        RCC->APB2ENR|=1<<6;         //port E clock enable           
        GPIOE->CRH &= 0XFFFF0F0F;
        GPIOE->CRH|=0X00003030;
       
}


int main(void)
{               
        u8 t=0;
GPIO_InitTypeDef  GPIO_InitStructure;         
         
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
        //delay_init();                     //ÑÓʱº¯Êý³õʼ»¯          
        //uart_init(115200);         //´®¿Ú³õʼ»¯Îª115200


       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE);         //ʹÄÜPB,PA,PE¶Ë¿ÚʱÖÓ
/*       
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                 //LED0-->PE.9 ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.5
GPIO_SetBits(GPIOE,GPIO_Pin_9);                                                 //PB.5 Êä³ö¸ß

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                             //LED1-->PE.5 ¶Ë¿ÚÅäÖÃ, ÍÆÍìÊä³ö
GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //ÍÆÍìÊä³ö £¬IO¿ÚËÙ¶ÈΪ50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_11);                                                  //PE.5 Êä³ö¸ß

*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOA.4
GPIO_SetBits(GPIOA,GPIO_Pin_4);                                                 //PA.4 Êä³ö¸ß

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //PA.5 ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.5
GPIO_SetBits(GPIOA,GPIO_Pin_5);                                                 //PA.5 Êä³ö¸ß

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                             //PA.6 ¶Ë¿ÚÅäÖÃ,
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                  //ÍÆÍìÊä³ö
GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //ÍÆÍìÊä³ö £¬IO¿ÚËÙ¶ÈΪ50MHz
GPIO_SetBits(GPIOA,GPIO_Pin_6);                                                  //PA.6Êä³ö¸ß


IICStart();
IICStart();   // collapse at  here... ??????????????????????????????????
         while(1)
        {

//IICStart();
               
        }         
}

使用特权

评论回复
11
OIU|  楼主 | 2021-7-15 11:29 | 只看该作者
完整测试代码,就是不行。

使用特权

评论回复
12
laocuo1142| | 2021-7-15 15:00 | 只看该作者
模拟IIC?

使用特权

评论回复
13
GlenX| | 2021-7-15 16:42 | 只看该作者
到处都有现成的,为什么要自己编?!
正点、网上很多模拟的,都不错。
我用HAL库,硬IIC,103、030、303都用过,效果也不错。就是例程很少。

使用特权

评论回复
14
OIU|  楼主 | 2021-7-15 17:26 | 只看该作者
模拟IIC 编好了,用到项目很久了,都很好的。这次只是改个端口而已。nxp 的 mcu换了stm32f103 用而已。这次就是pa端口 设置高低电平而已,器件都没有接,就把stm32干翻。

使用特权

评论回复
15
小小沙沙粒| | 2021-7-16 13:00 | 只看该作者
写的一团糟

使用特权

评论回复
16
两只袜子| | 2021-7-16 19:40 | 只看该作者
查一下IIC硬件接口

使用特权

评论回复
17
里面有晴雨| | 2021-7-17 09:11 | 只看该作者
为什么崩溃呢?不了解。看看I2C是否正确吧,其它的地方好像发现不了问题的。

使用特权

评论回复
18
kingkits| | 2021-7-19 08:35 | 只看该作者
需要注意的是,SDA 端口设置时,必须设置成 OD,且外部需要接上拉电阻

使用特权

评论回复
19
kiwis66| | 2021-7-19 09:15 | 只看该作者
这只是设置,
模拟的话,不是还有数据发送和接收,么

使用特权

评论回复
20
renzheshengui| | 2021-8-6 16:39 | 只看该作者
是不是延时函数过多啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OIU

28

主题

81

帖子

0

粉丝