打印
[应用相关]

STM32开发板例程讲解,GPIO的描述和配置,GPIO_IOTG例程精讲

[复制链接]
楼主: 和下土
手机看帖
扫描二维码
随时随地手机跟帖
21
和下土|  楼主 | 2021-8-4 15:59 | 只看该作者 回帖奖励 |倒序浏览
2 、RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位;

使用特权

评论回复
22
和下土|  楼主 | 2021-8-4 16:00 | 只看该作者
3、配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)和匹配速度。

使用特权

评论回复
23
和下土|  楼主 | 2021-8-4 16:01 | 只看该作者
4 、GPIO初始化完成

使用特权

评论回复
24
和下土|  楼主 | 2021-8-4 16:01 | 只看该作者
四、GPIO实例



#include "stm32f10x.h"

#include "stm32_eval.h"



GPIO_InitTypeDef GPIO_InitStructure;



void RCC_Configuration(void);

void Delay(__IO uint32_t nCount);





int main(void)

{

  RCC_Configuration();  



#if 0

使用特权

评论回复
25
和下土|  楼主 | 2021-8-4 16:02 | 只看该作者
// 配置所有未使用GPIO引脚为输入模式(浮空输入),这样可以降低功耗,并且提高器件的抗EMI/EMC 的性能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |

                         RCC_APB2Periph_GPIOE, ENABLE);



  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_Init(GPIOC, &GPIO_InitStructure);


使用特权

评论回复
26
和下土|  楼主 | 2021-8-4 16:03 | 只看该作者
//armfly :注释掉的原因是当代码在外部存储器运行时,GPIOD,E,F,G部分IO用于FSMC,因此对这些IO不能重置,否则导致取指异常

  // GPIO_Init(GPIOD, &GPIO_InitStructure);

  // GPIO_Init(GPIOE, &GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |

                         RCC_APB2Periph_GPIOE, DISABLE);

#ifdef USE_STM3210E_EVAL

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);

  // armfly :由于代码在外部SRAM运行时,GPIOD,E,F,G部分IO用于FSMC,

      因此对这些IO不能重置,否则导致取指异常

使用特权

评论回复
27
和下土|  楼主 | 2021-8-4 16:05 | 只看该作者
//  GPIO_Init(GPIOF, &GPIO_InitStructure);

  //  GPIO_Init(GPIOG, &GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, DISABLE);

#endif

#endif


使用特权

评论回复
28
和下土|  楼主 | 2021-8-4 16:07 | 只看该作者
// 初始化STM3210X-EVAL板上的4个LED,即初始化LED对应的IO引脚

  STM_EVAL_LEDInit(LED1);

  STM_EVAL_LEDInit(LED2);

  STM_EVAL_LEDInit(LED3);

  STM_EVAL_LEDInit(LED4);



  while (1)

  {

    STM_EVAL_LEDOn(LED1);

   

使用特权

评论回复
29
和下土|  楼主 | 2021-8-4 16:14 | 只看该作者
// 原始值 = 0xAFFFF,但是当代码在外部RAM运行时,效率很低,会延迟10秒以上,而到代码在内部RAM或内部Flash执行时,速度很快,小于100ms

       Delay(0xAFFFF);



    // Turn on LD2 and LD3

    STM_EVAL_LEDOn(LED2);

    STM_EVAL_LEDOn(LED3);

    // Turn off LD1

    STM_EVAL_LEDOff(LED1);

    // Insert delay

    Delay(0xAFFFF);


使用特权

评论回复
30
和下土|  楼主 | 2021-8-4 16:17 | 只看该作者
// Turn on LD4   

STM_EVAL_LEDOn(LED4);

    //Turn off LD2 and LD3

    STM_EVAL_LEDOff(LED2);

    STM_EVAL_LEDOff(LED3);

    //Insert delay

    Delay(0xAFFFF);



    //Turn off LD4

    STM_EVAL_LEDOff(LED4);

  }

}



void RCC_Configuration(void)

{  

使用特权

评论回复
31
和下土|  楼主 | 2021-8-4 16:18 | 只看该作者
// 建立MCU系统,初始化嵌入式FLASH接口,初始化锁相环(附注1)和系统频率参数

  SystemInit();

}



void Delay(__IO uint32_t nCount)

{

  for(; nCount != 0; nCount--);

}



#ifdef  USE_FULL_ASSERT

使用特权

评论回复
32
和下土|  楼主 | 2021-8-4 16:19 | 只看该作者
// @brief  Reports the name of the source file and the source line number

//  where the assert_param error has occurred.

//@param  file: pointer to the source file name

// @param  line: assert_param error line source number

  // @retval None

void assert_failed(uint8_t* file, uint32_t line)

{

使用特权

评论回复
33
和下土|  楼主 | 2021-8-4 16:24 | 只看该作者
// User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line)

  //Infinite loop   

while (1)

  {

  }

}

#endif

使用特权

评论回复
34
和下土|  楼主 | 2021-8-4 16:27 | 只看该作者
// User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line)

  //Infinite loop   

while (1)

  {

  }

}

#endif

使用特权

评论回复
35
和下土|  楼主 | 2021-8-4 16:28 | 只看该作者
//******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****



void SystemInit (void)在system_stm32f10x.c中:



void SystemInit (void)

{

// 复位RCC时钟配置到默认状态(用于调试)

// Set HSION bit

  RCC->CR |= (uint32_t)0x00000001;

使用特权

评论回复
36
和下土|  楼主 | 2021-8-4 16:28 | 只看该作者
//Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits

#ifndef STM32F10X_CL

  RCC->CFGR &= (uint32_t)0xF8FF0000;

#else

  RCC->CFGR &= (uint32_t)0xF0FF0000;

#endif //STM32F10X_CL



  // Reset HSEON, CSSON and PLLON bits

  RCC->CR &= (uint32_t)0xFEF6FFFF;



  // Reset HSEBYP bit

  RCC->CR &= (uint32_t)0xFFFBFFFF;



  //Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits

  RCC->CFGR &= (uint32_t)0xFF80FFFF;


使用特权

评论回复
37
和下土|  楼主 | 2021-8-4 16:29 | 只看该作者
#ifdef STM32F10X_CL

  //Reset PLL2ON and PLL3ON bits

  RCC->CR &= (uint32_t)0xEBFFFFFF;



//Disable all interrupts and clear pending bits

  RCC->CIR = 0x00FF0000;



  // Reset CFGR2 register

  RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)

  // Disable all interrupts and clear pending bits

  RCC->CIR = 0x009F0000;



  //Reset CFGR2 register

  RCC->CFGR2 = 0x00000000;     

#else

  // Disable all interrupts and clear pending bits

  RCC->CIR = 0x009F0000;

#endif // STM32F10X_CL

   

#if defined (STM32F10X_HD) || (defined STM32F10X_XL)

  #ifdef DATA_IN_ExtSRAM

    SystemInit_ExtMemCtl();

  #endif // DATA_IN_ExtSRAM

#endif

使用特权

评论回复
38
和下土|  楼主 | 2021-8-4 16:35 | 只看该作者
//配置系统时钟频率,HCLK, PCLK2 和 PCLK1 的预分频

  //配置Flash延迟周期,使能预存取缓冲区

  SetSysClock();

}


使用特权

评论回复
39
和下土|  楼主 | 2021-8-4 16:36 | 只看该作者
再次总结一下GPIO的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//

(1)      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B |C, ENABLE):使能APB2总线外设时钟

使用特权

评论回复
40
和下土|  楼主 | 2021-8-4 16:36 | 只看该作者
(2)     RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位

GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; //50M时钟速度

使用特权

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

本版积分规则