OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2314|回复: 3

stm32方法总结

[复制链接]

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
发表于 2017-12-21 16:33:33 | 显示全部楼层 |阅读模式
本帖最后由 慧心的眼眸 于 2017-12-21 17:07 编辑

  相信很多人学习单片机都是从51开始的,而相对于51来说,stm32的代码量明显增加,并且了解到一定程度就知道stm32的代码不可能都自己写(因为代码量不允许),因此学习方向一般分为库函数开发和寄存器开发方式。初学者最好通过库函数方式进行学习,因为stm32的寄存器太多了,会看晕的。而直接调用打包好的库函数,学习难度就会简单很多。比如:GPIO口来说(创建工程和添加项目和51相似,不在多说)主要写一个时钟使能函数和结构体定义函数函数,然后在主函数中调用GPIO的初始化就好了,示例程序:
  //LED IO初始化
  void LED_Init(void)
  {
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIO时钟
  //GPIOF9,F10的初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//以上为GPIO初始化具体内容
  GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10初始为灯灭状态
  //GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);GPIOF9,F10初始为灯亮状态
  }1234567891011121314151617181920
  这样一看主体就是三部分,时钟使能,GPIO初始化内容设置,IO口位置对应电平高低。同理中断,串口,ADC等都是这样的,只要能够熟练调用这些函数并理解意思,就可以很好初步掌握stm32。再以中断为例:
  void EXTI0_IRQHandler(void)
  {
  delay_ms(10);
  if(WK_UP==1) //按下WK_UP键触发
  {
  BEEP=!BEEP; //蜂鸣器翻转
  }
  EXTI_ClearITPendingBit(EXTI_Line0); //清楚LINE0上的中断标志位
  }
  void EXTI2_IRQHandler(void)
  {
  delay_ms(10);
  if(KEY2==0) //按下KEY2键触发
  {
  LED0=!LED0; //LED0翻转
  }
  EXTI_ClearITPendingBit(EXTI_Line2); //清楚LINE2上的中断标志位
  }
  void EXTIX_Init(void)
  {
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  KEY_Init(); //按键初始化函数
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);//PE2 连接到中断线2,下同
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
  EXTI_InitStructure.EXTI_Line=EXTI_Line2;
  EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断时能
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
  EXTI_Init(&EXTI_InitStructure);//中断触发方式
  EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  EXTI_InitStructure.EXTI_LineCmd=ENABLE;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStructure);
  NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x03;//响应(子)优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
  NVIC_Init(&NVIC_InitStructure);//中断优先级
  NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
  NVIC_Init(&NVIC_InitStructure);
  }12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  看样子代码挺长,其实很有规律,一共有三个函数,前两个就是中断函数了,而第三个就是中断函数的初始化函数前两个学过51的人都知道,都能够满足一定条件,就会跳进中断,而进入中断的方式以及中断进行的优先级就由初始化函数里配置了。
  通过上面两个例子大家对stm32学习方向有个大概了解吧。
stm32学习交流群:197416462   学习卡赠送  892829057  备注学习卡
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-6-26
在线时间
7 小时
发表于 2017-12-21 16:48:33 | 显示全部楼层
哥们儿,你这代码显示有问题。更改一下哈
回复 支持 反对

使用道具 举报

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
 楼主| 发表于 2017-12-21 17:00:04 | 显示全部楼层
wgf805629564 发表于 2017-12-21 16:48
哥们儿,你这代码显示有问题。更改一下哈

谢谢提醒  
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-21 21:43:13 | 显示全部楼层
楼主中断用延时函数.不太好呀.
学校学的延时函数,最好不要拿出来用呀.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 16:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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