用户工具

站点工具


icore3l_arm_3

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore3l_arm_3 [2020/11/25 14:41]
zgf
icore3l_arm_3 [2022/03/19 10:57] (当前版本)
sean
行 2: 行 2:
 |技术支持电话|**0379-69926675-801** ​ ||| |技术支持电话|**0379-69926675-801** ​ |||
 |技术支持邮件|Gingko@vip.163.com ​ ||| |技术支持邮件|Gingko@vip.163.com ​ |||
-|技术论坛|http://​www.eeschool.org ​ ||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V0.1  |2020-11-18 ​ |  gingko ​ |  初次建立 ​ | |  V0.1  |2020-11-18 ​ |  gingko ​ |  初次建立 ​ |
  
-===== STM32CubeMX教程三——GPIO输入实验 ​(未完成)===== +===== STM32CubeMX教程三——GPIO输入实验 ===== 
-1.在主界面选择File-->​New Project或者直接点击ACCEE TO MCU SELECTOR新建项目 +1.在主界面选择File-->​New Project或者直接点击ACCEE TO MCU SELECTOR新建工程
 {{ :​icore3l:​icore3l_cube_3_1.png?​direct |}} {{ :​icore3l:​icore3l_cube_3_1.png?​direct |}}
-2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片本实验选取的芯片型号为:STM32F429IGHx+2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片本实验选取的芯片型号为:STM32F429IGHx
 {{ :​icore3l:​icore3l_cube_3_2.png?​direct |}} {{ :​icore3l:​icore3l_cube_3_2.png?​direct |}}
-3.配置RCC,使用外部时钟源+3.配置RCC,使用外部时钟源,HSE选择“Crystal/​Ceramic Resonator”
 {{ :​icore3l:​icore3l_cube_3_3.png?​direct |}} {{ :​icore3l:​icore3l_cube_3_3.png?​direct |}}
 4.配置调试引脚 4.配置调试引脚
行 73: 行 71:
 {{ :​icore3l:​icore3l_arm_hal_3_1.png?​direct |}} {{ :​icore3l:​icore3l_arm_hal_3_1.png?​direct |}}
   * 本实验中按键的一端与STM32的GPIO(PG9)相连,另外一端接地,且PG9外接一个上拉电阻。初始化时把PG9设置成输入模式,当按键未按下时,由于上拉电阻R23的作用,相当于ARM_KEY引脚与D3V3短接,此时ARM_KEY引脚呈高电平;当按键按下时,ARM_KEY与DCOM短接,ARM_KEY引脚呈低电平,从而实现通过按键的松开与按下来控制对ARM_KEY引脚的高低电平输入,然后再通过程序实现用ARM_KEY引脚的高低电平状态来控制三色LED的循环点亮,这就是本实验的实验原理。   * 本实验中按键的一端与STM32的GPIO(PG9)相连,另外一端接地,且PG9外接一个上拉电阻。初始化时把PG9设置成输入模式,当按键未按下时,由于上拉电阻R23的作用,相当于ARM_KEY引脚与D3V3短接,此时ARM_KEY引脚呈高电平;当按键按下时,ARM_KEY与DCOM短接,ARM_KEY引脚呈低电平,从而实现通过按键的松开与按下来控制对ARM_KEY引脚的高低电平输入,然后再通过程序实现用ARM_KEY引脚的高低电平状态来控制三色LED的循环点亮,这就是本实验的实验原理。
 +
 +==== 四、 实验程序 ====
 +
 +=== 1.主函数 ===
 +<code c>
 +int main(void) ​  
 +{
 +    HAL_Init(); ​                //​重置所有外围设备,初始化Flash接口和Systick
 +    SystemClock_Config(); ​    //​配置系统时钟
 +    MX_GPIO_Init(); ​           //​初始化所有已配置的外围设备
 +    LED_RED_ON; ​                //​初始化LED状态为红灯点亮 ​
 +    while (1) ​                  //​按键按一次切换一次LED状态
 +    {
 +        /* 按键扫描函数在stm32f4xx_it.c文件中调用,每20ms扫描一次按键状态 */​  
 +     ​   /​* 按键处理函数,每按下一次,LED状态改变一次 */​  
 +        key.process();​
 +    }                    ​
 +}
 +</​code> ​
 +=== 2.按键处理函数 ===
 +<code c>
 +static void process(void)  
 +{  
 +    static int cnt = 0;​  
 +    if(key.value != key.bak_value){   //​按键处理 
 +     ​   switch(key.value){  
 +         ​   case ARM_KEY:​  
 +                if(cnt % 3 == 0){
 +                    LED_RED_OFF;​
 +                    LED_BLUE_ON;​
 +                    LED_GREEN_OFF;​ 
 +                }else if(cnt % 3 == 1){
 +                    LED_RED_OFF;​
 +                    LED_BLUE_OFF;​
 +                    LED_GREEN_ON;​ 
 +                }else if(cnt % 3 == 2){  
 +                    LED_RED_ON;
 +                    LED_BLUE_OFF;​
 +                   ​LED_GREEN_OFF;​
 +                }
 +                cnt ++;
 +                if(cnt > 2)
 +             cnt = 0;
 +                break;​ 
 +        }  
 +     ​   key.bak_value = key.value;​  
 +    }  
 +}
 +</​code> ​
 +=== 3.按键状态读取函数(该函数每20ms调用一次,进行按键扫描) ===
 +<code c>
 +static unsigned char read(void)  
 +{  
 +    static unsigned char key_state = 0;​  
 +    static unsigned int key_value;​  
 +    static unsigned char key_return = 0;​  
 +      
 +    switch(key_state){  
 +        case 0: ​     //​按键被按下
 +            if(!(ARM_KEY_VALUE)){  
 +                key_state ++;​  
 +                key_value = ARM_KEY_VALUE;​  
 +            }  
 +            break;​  
 +        case 1: ​     //​消抖处理
 +            if(key_value != ARM_KEY_VALUE){  
 +                key_state --;​  
 +            }else{  
 +                switch(key_value){  
 +                    case 0x00:​  
 +                        key_return = ARM_KEY;​  
 +                        break;​  
 +                }  
 +                key_state ++;​  
 +            }  
 +            break;​  
 +        case 2: ​     //​按键释放
 +            if(ARM_KEY_VALUE == 0x01){  
 +                key_state = 0;​  
 +                key_return = KEY_NONE;​  
 +            }  
 +            break;​  
 +    }  
 +    return key_return;​  
 +}  
 +</​code>​
 +=== 4.定时器处理函数SysTick_Handler( ) ===
 +<code c>
 +void SysTick_Handler(void)
 +{
 +    static int counter = 0;
 +    unsigned char temp;
 +    HAL_IncTick();​
 +    if(counter++ % 20 == 0){         //​设置定时时间为20ms
 + if(key.bak_value == key.value){
 +     temp = key.read();
 +            if(temp != 0){
 + key.value = temp;
 +     }
 + }
 +    }
 +}
 +</​code>​
 +==== 五、 实验步骤 ====
 +
 +  - 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连);
 +  - 把iCore3L通过Micro USB线与计算机相连,为iCore3L供电;
 +  - 打开Keil MDK开发环境,并打开本实验工程;
 +  - 烧写程序到iCore3L上;
 +  - 也可以进入Debug模式,单步运行或设置断电运行观察LED状态。
 +==== 六、 实验现象 ====
 +  * 程序下载完成以后,三色LED灯先亮红色,然后按键每按下一次,三色LED颜色变换(按照红色、蓝色、绿色依次轮流变换)一次。
icore3l_arm_3.1606286516.txt.gz · 最后更改: 2020/11/25 14:41 由 zgf