stm32

stm32

stm32方法总结

相信很多人学习单片机都是从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初始为灯亮状态

}

这样一看主体就是三部分,时钟使能,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);
}

看样子代码挺长,其实很有规律,一共有三个函数,前两个就是中断函数了,而第三个就是中断函数的初始化函数前两个学过51的人都知道,都能够满足一定条件,就会跳进中断,而进入中断的方式以及中断进行的优先级就由初始化函数里配置了。
通过上面两个例子大家对stm32学习方向有个大概了解吧。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值