找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4417|回复: 2
打印 上一主题 下一主题
收起左侧

STM32寄存器工程-点亮一颗LED

[复制链接]
跳转到指定楼层
楼主
关于STM32寄存器工程入门之点亮一颗LED
以下为自己学习寄存器版本STM3整理后的工程,使用位段方法方法实现。带详细注释备注,可供学习参考。


单片机源程序如下:
  1. #include "sys.h"  
  2. #include "stm32f407xx.h"
  3. //////////////////////////////////////////////////////////////////////////////////         
  4. //ALIENTEK STM32F407开发板
  5. //系统时钟初始化       
  6. //包括时钟设置/中断管理/GPIO设置等
  7. //创建日期:2017.9.12
  8. //********************************************************************************

  9. //GPIOF设置
  10. //MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
  11. //OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
  12. //OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
  13. //PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
  14. //注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
  15. void GPIOF_Set(u8 pin,u8 mode, u8 otype,u8 ospeed,u8 updow)
  16. {
  17.         //配置为输出
  18.         GPIOF_MODER &=~(3<<(pin*2));        //先清除原来的设置 1111 01 1111
  19.         GPIOF_MODER |=(mode<<(pin*2);        //设置新的模式
  20.         //配置2M响应速度
  21.         GPIOF_OSPEEDR &=~(3<<(pin*2));        //清除原来的设置
  22.         GPIOF_OSPEEDR |=(ospeed<<(pin*2));//设置新的速度值  
  23.         //配置推挽还是开漏
  24.         GPIOF_OTYPER &=~(1<<pin) ;                //清除原来的设置
  25.         GPIOF_OTYPER|=otype<<pin;                //设置新的输出模式
  26.         //配置是否采用上下拉
  27.         GPIOF_PUPD &=~(3<<(pin*2));        //先清除原来的设置
  28.         GPIOF_PUPD |=updow<<(pin*2);        //设置新的上下拉
  29. }

  30. //时钟设置函数
  31. //Fvco=Fs*(plln/pllm);
  32. //Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
  33. //Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));

  34. //Fvco:VCO频率
  35. //Fsys:系统时钟频率
  36. //Fusb:USB,SDIO,RNG等的时钟频率
  37. //Fs:PLL输入时钟频率,可以是HSI,HSE等.
  38. //plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
  39. //pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
  40. //pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
  41. //pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.

  42. //外部晶振为8M的时候,推荐值:plln=336,pllm=8,pllp=2,pllq=7.
  43. //得到:Fvco=8*(336/8)=336Mhz
  44. //     Fsys=336/2=168Mhz
  45. //     Fusb=336/7=48Mhz
  46. //返回值:0,成功;1,失败。
  47. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq)
  48. {
  49.         u16 retry=0;
  50.         u8 status=0;
  51.         RCC_CR|=1<<16;                                //HSE 开启,开启外部高速时钟
  52.         while(((RCC_CR&(1<<17))==0)&&(retry<0X1FFF))retry++;//等待HSE RDY
  53.         if(retry==0X1FFF)status=1;        //HSE无法就绪
  54.         else   
  55.         {
  56.                 RCC_APB1ENR | =1<<28;        //电源接口时钟使能
  57.                 PWR_CR | =3<<14;                 //高性能模式,时钟可到168Mhz
  58.                 RCC_CFGR | =(0<<4)|(5<<10)|(4<<13);//HCLK 不分频;APB1 4分频,42M;APB2 2分频.84M
  59.                 RCC_CR & =~(1<<24);        //关闭主PLL
  60.                 RCC_PLLCFGR=pllm|(plln<<6)|(((pllp>>1)-1)<<16)|(pllq<<24)|(1<<22);//配置主PLL,PLL时钟源来自HSE
  61.                 RCC_CR | =1<<24;                        //打开主PLL
  62.                 while((RCC_CR &(1<<25))==0);//等待PLL准备好
  63.                 FLASH_ACR | =1<<8;                //指令预取使能.
  64.                 FLASH_ACR | =1<<9;                //指令cache使能.
  65.                 FLASH_ACR | =1<<10;                //数据cache使能.
  66.                 FLASH_ACR | =5<<0;                //5个CPU等待周期.
  67.                 RCC_CFGR & =~(3<<0);                //清零
  68.                 RCC_CFGR | =2<<0;                //选择主PLL作为系统时钟         
  69.                 while((RCC_CFGR & (3<<2))!=(2<<2));//等待主PLL作为系统时钟成功.
  70.         }
  71.         return status;
  72. }  

  73. //系统时钟初始化函数
  74. //plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
  75. //pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
  76. //pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
  77. //pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
  78. void STM32_Glock_Init(u32 plln,u32 pllm,u32 pllp,u32pllq)
  79. {  
  80.         RCC_CR | =0x00000001;                     //设置HISON,开启内部高速RC振荡。开启内部高速时钟
  81.         RCC_CFGR=0x00000000;                        //CFGR清零
  82.         RCC_CR & =0xFEF6FFFF;                        //HSEON,CSSON,PLLON清零 ,F1110F0110FFFF
  83.         RCC_PLLCFGR=0x24003010;                     //PLLCFGR恢复复位值
  84.         RCC_CR & =~(1<<18);                                //HSEBYP清零,外部晶振不旁路
  85.         RCC_CIR=0x00000000;                     //禁止RCC时钟中断 。C:时钟。I:中断
  86.         Sys_Clock_Set(plln,pllm,pllp,pllq);//设置时钟 ,启动外部时钟,配置
  87. }
复制代码

所有资料51hei提供下载:
点亮一颗LED灯.rar (118.58 KB, 下载次数: 36)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:427201 发表于 2018-11-15 17:22 | 只看该作者
新手学习
回复

使用道具 举报

板凳
ID:427382 发表于 2018-11-15 21:45 来自手机 | 只看该作者
新手学习
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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