[应用相关] STM32开发板例程讲解,GPIO的描述和配置,GPIO_IOTG例程精讲

[复制链接]
2937|66
 楼主| 和下土 发表于 2021-8-4 15:59 | 显示全部楼层
2 、RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位;
 楼主| 和下土 发表于 2021-8-4 16:00 | 显示全部楼层
3、配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)和匹配速度。
 楼主| 和下土 发表于 2021-8-4 16:01 | 显示全部楼层
4 、GPIO初始化完成
 楼主| 和下土 发表于 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
 楼主| 和下土 发表于 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);


 楼主| 和下土 发表于 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不能重置,否则导致取指异常
 楼主| 和下土 发表于 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


 楼主| 和下土 发表于 2021-8-4 16:07 | 显示全部楼层
  1. // 初始化STM3210X-EVAL板上的4个LED,即初始化LED对应的IO引脚

  2.   STM_EVAL_LEDInit(LED1);

  3.   STM_EVAL_LEDInit(LED2);

  4.   STM_EVAL_LEDInit(LED3);

  5.   STM_EVAL_LEDInit(LED4);



  6.   while (1)

  7.   {

  8.     STM_EVAL_LEDOn(LED1);

  9.    
 楼主| 和下土 发表于 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);


 楼主| 和下土 发表于 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)

{  
 楼主| 和下土 发表于 2021-8-4 16:18 | 显示全部楼层
// 建立MCU系统,初始化嵌入式FLASH接口,初始化锁相环(附注1)和系统频率参数

  SystemInit();

}



void Delay(__IO uint32_t nCount)

{

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

}



#ifdef  USE_FULL_ASSERT
 楼主| 和下土 发表于 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)

{
 楼主| 和下土 发表于 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
 楼主| 和下土 发表于 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
 楼主| 和下土 发表于 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;
 楼主| 和下土 发表于 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;


 楼主| 和下土 发表于 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
 楼主| 和下土 发表于 2021-8-4 16:35 | 显示全部楼层
//配置系统时钟频率,HCLK, PCLK2 和 PCLK1 的预分频

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

  SetSysClock();

}


 楼主| 和下土 发表于 2021-8-4 16:36 | 显示全部楼层
再次总结一下GPIO的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//

(1)      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B |C, ENABLE):使能APB2总线外设时钟
 楼主| 和下土 发表于 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时钟速度
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部