[范例教程] 【M0】 MG32F02A 学习笔记② GPIO 点亮 LED

[复制链接]
 楼主| noctor 发表于 2018-9-12 14:58 | 显示全部楼层 |阅读模式
本帖最后由 noctor 于 2018-9-14 09:33 编辑

      上回我们说到了笙泉M0 MG32F02A的硬件和环境搭建,详情可以看看我的帖子:http://bbs.21ic.com/icview-2550064-1-1.html      那么我们就开始来正式摸一摸这个IC的外设吧。      这次呢我们先来最基本的,点亮LED来认识我们GPIO是怎么使用的吧。
      不过呢,在这之前,我们先来看一下我们上回说过的从官网下载的开发包,在开发包中包含Sample_Code文件夹,该文件夹内的项目包含了该款IC的一些外设使用。
      打开这个Sample_Code项目,我们可以看到这个项目的结构,而且这个项目是已经配置好可用的了,所以如果我们想创建个项目可以直接使用这个Sample_Code项目并删除掉不需要的目录以节省空间即可。
      
       作为一个初学者,表示我根本不知道这个ConfigerWizard是用来干嘛的,直到后来才知道到底怎么去使用这个超好用的东西。
      
        就比如说我们今天要配置的GPIO吧,首先,我们双击MG32x02z_CSC_Init.h,你会发现,代码区下面有一个选项卡。
        
        我们点击它,就会出现下面这个画面:
        
         各种选项一目了然,剩下的就是傻瓜式的自行配置需要的选项即可。
         以下我们以我们点亮位于PE15的LED为例,进行配置吧,首先在MG32x02z_CSC_Init.h中的Configure Peripheral On Mode Clock的Port E勾选,然后一样的办法,在MG32x02z_GPIO_Init.h中的GPIO Initial下的GPIOE configuration下的PE15  configuration打勾,并在PE15下的Pin Mode选择PPO(推挽输出)即可,Pin Mode 选项中各选项含义:AIO(模拟输入输出)、ODO(开漏输出)、PPO(推挽输出)、DIN(数字输入)。而Pin alternate funcion就是引脚复用了,最全的引脚复用在数据手册里面有列出。选项如图:
        
          OK,配置就是这么简单,接下来我们直接在main.c里面添加PE15=0;就可以了。
          代码如下:
  1. int main()
  2. {
  3. //Setp 1. Open "Sample.h" and select "Configuration Wizard" for tab below
  4.     //Setp 2. Select sample code marcro
  5.     //Setp 3. Select the corresponding sub sample
  6.     //Setp 4. You can open the corresponding .c file to see the sample code source for MG32x02z_Sample folder
  7.     ChipInit();//该函数不能注释掉哦

  8.    
  9. //   Sample_Code();

  10.         PE15=0;//To do......

  11. }
      编译成功,点击load按钮烧进IC内,记得要自己先上电才能烧进去哦,M-Link仿真器是不带给IC供电的。烧进去之后按下板子上的复位键,PE15上的LED就亮起来了。

       有人可能会说,用这个wizard太傻瓜式了,能不能完全用代码实现呢?当然可以。
       既然我们是用代码实现,那么我们wizard就不需要了,直接删除就好,当然了我们的Drivers目录可别删掉了。
       代码如下,此处注意CSC_Init()是与系统函数重合的,需要改名或者直接删除mg32x02z_Init目录:

  1. #include "MG32x02z_DRV.H"



  2. void CSC_Init (void)
  3. {
  4.         CSC_PLL_TyprDef CSC_PLL_CFG;
  5.    
  6.         
  7.   UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  8.   MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  9.   ProtectModuleReg(MEMprotect);

  10.   UnProtectModuleReg(CSCprotect);
  11.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  12.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  13.         
  14.         /* CK_HS selection */
  15.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  16.         CSC_IHRCO_Cmd(ENABLE);
  17.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  18.         CSC_ClearFlag(CSC_IHRCOF);
  19.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


  20.         /* PLL */
  21.         /**********************************************************/
  22.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  23.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  24.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  25.         CSC_PLL_Config(&CSC_PLL_CFG);
  26.         CSC_PLL_Cmd(ENABLE);
  27.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  28.         CSC_ClearFlag(CSC_PLLF);
  29.         /**********************************************************/

  30.         
  31.         /* CK_MAIN */
  32.         CSC_CK_MAIN_Select(MAIN_CK_PLLO);        


  33.         /* Configure ICKO function */
  34.                
  35.         /* Configure peripheral clock */

  36.          CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);
  37.     ProtectModuleReg(CSCprotect);
  38.    
  39. }



  40. void InitGPIO(void)
  41. {
  42.         PIN_InitTypeDef PINX_InitStruct;
  43.    
  44.    
  45.         //==Set GPIO init
  46.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                 // Pin select Push Pull mode
  47.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
  48.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                        
  49.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
  50.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  51.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse

  52.         PINX_InitStruct.PINX_Alternate_Function  = PE13_AF_GPE13;                                // Pin AFS = GPIO
  53.         GPIO_PinMode_Config(PINE(13),&PINX_InitStruct);                                                          //

  54.         PINX_InitStruct.PINX_Alternate_Function  = PE14_AF_GPE14;                                // Pin AFS = GPIO
  55.         GPIO_PinMode_Config(PINE(14),&PINX_InitStruct);                                                          //

  56.         PINX_InitStruct.PINX_Alternate_Function  = PE15_AF_GPE15;                                // Pin AFS = GPIO
  57.         GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                                  //
  58. }



  59. int main()
  60. {

  61.         CSC_Init();
  62.         InitGPIO();
  63.         PE15=0;
  64. }

         OK,作为摸开发板的基础,点亮LED成功!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
344864311 发表于 2018-10-9 15:49 | 显示全部楼层
写的不错
344864311 发表于 2018-10-9 15:52 | 显示全部楼层
本帖最后由 344864311 于 2018-10-9 17:01 编辑

你用的是keil5什么版本啊,
 楼主| noctor 发表于 2018-10-9 16:46 | 显示全部楼层
344864311 发表于 2018-10-9 15:52
你用的是keil5什么版本啊,我的版本没有出现 configerwizard

谢谢支持呀,我的Keil版本是5.18,不过后面我的帖子并不建议你继续用wizard了,有可能会让你查错差不到
344864311 发表于 2018-10-9 17:53 | 显示全部楼层
好的 ,谢谢。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

82

帖子

3

粉丝

26

主题

82

帖子

3

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