OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3654|回复: 4

KEIL代码优化等级降低,IO初始化出问题求解

[复制链接]

9

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-3-11
在线时间
74 小时
发表于 2017-9-24 10:48:01 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 kaxilion 于 2017-9-24 11:05 编辑

由于每次IO口初始化都一大堆引脚配置看得累,就打算用个函数去封装起来,以下是输入输出封装的函数:

void GPIO_Out_Setting(u32 pin,GPIO_TypeDef* GPIOx,GPIOMode_TypeDef mode,GPIOOType_TypeDef type,GPIOPuPd_TypeDef pupd)
{
       GPIO_InitTypeDef  GPIO_InitStructure;        
       GPIO_InitStructure.GPIO_Pin = pin;
       GPIO_InitStructure.GPIO_Mode = mode;
       GPIO_InitStructure.GPIO_OType = type;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_InitStructure.GPIO_PuPd = pupd;
       GPIO_Init(GPIOx, &GPIO_InitStructure);
}

void GPIO_In_Setting(u32 pin,GPIO_TypeDef* GPIOx,GPIOMode_TypeDef mode,GPIOPuPd_TypeDef pupd)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = pin;
        GPIO_InitStructure.GPIO_Mode = mode;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStructure.GPIO_PuPd = pupd;
        GPIO_Init(GPIOx, &GPIO_InitStructure);
}


出问题的代码:
#if 1
        GPIO_In_Setting(ADC_CH1_PIN | ADC_CH2_PIN | ADC_CH3_PIN,ADC_CH_PORT,GPIO_Mode_AN,GPIO_PuPd_NOPULL);
#else
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = ADC_CH1_PIN | ADC_CH2_PIN | ADC_CH3_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;                        //模拟输入
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;                //不带上下拉
        GPIO_Init(ADC_CH_PORT, &GPIO_InitStructure);                        //初始化  
#endif

GPIO_In_Setting这个函数不单单用于ADC,还用于EXTI和一些输入管脚,USART子类的,如果我用GPIO_In_Setting来实现功能的话,代码优先级必须要O2,如果用O0就会出问题,ADC的数据乱飞,EXTI会进不了中断,如果用原始的下面的几行来初始化ADC引脚,用O2和O0都正常,EXTI也同理,搞不懂是为什么,感觉是这个函数把不同管脚的参数搞混了...

一开始我以为是GPIO_InitStructure.GPIO_OType和GPIO_InitStructure.GPIO_Speed的配置问题,看了下手册,说是在输入时GPIO_OType配置是什么都没关系的,GPIO_Speed倒是配置一个确定的参数就好了,删掉这两行还是出现同样的问题,求各位大佬指导下,谢啦


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-3-11
在线时间
74 小时
 楼主| 发表于 2017-9-24 10:53:27 | 显示全部楼层
对了,我的芯片型号是F407的,以前在F103上也是这么配置的,都没出现问题,因为我一开始建立工程的时候是设置成O2去跑的,后面改成O0反而出现一些很奇怪的问题,搜了下一般都是O0改成O2会出问题,高优化改成低优化出问题实在搞不懂了
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2017-9-24 11:40:02 | 显示全部楼层
自己得代码可别让编译器给你优化,自己优化保险
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2017-9-24 21:32:45 | 显示全部楼层
先调出功能出来了,再进行优化吧!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-9-25 00:41:50 | 显示全部楼层
用寄存器版本的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 16:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表