微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手+菜鸟,随便写写,最后发一个自己写的程序--EXTI

新手+菜鸟,随便写写,最后发一个自己写的程序--EXTI

时间:10-02 整理:3721RD 点击:
小弟最近在学习stm32,想发个程序,和大家交流一下。
开发板是前辈画的,好像是用来测试一个3G功能的,不过对于我来说太远;我要来了3个,自己焊了一个最小系统,好在公司资源还是不错的,器件芯片有,还可以问问前辈--对公司还是比较满意的,虽然工资少了点,但学东西第一位O(∩_∩)O~。
        最开始当然是建工程了,这个真不太会,前前后后竟用了一周(时间真长,别见笑啊),上网查资料, 问前辈,自己琢磨。总算搞定,然后从GPIO开始学,开始还真没什么头绪(虽然在大学学点51,但完全没有真正应用,顶多是跑马灯实验),开始纠结是从寄存器开始学还是从库函数开始学,后来看到一句“用库函数入门,用寄存器提高”于是下定决心用库,但当时没有库的概念,结果走了很多弯路,看了很多不必要的东西,当时竟没理解到只是调用库就OK了,别的不用管。最后潜心看完一个例程后照猫画虎写了一个,经过了多次调试以后,灯终于亮了!那个兴奋啊。接着学的EXTI,当时对中断的理解只是概念上的,也不知道中断程序要放在中断函数里(it.c),总之现在想想当时怎么那么不开窍啊。慢慢的中断也弄出来了,一会我会把程序贴出来,很简单的嘿。慢慢的有点感觉找到门了:先大致看一下要学习概要,找个例程,一个函数一个函数的看,重点理解配置的什么,参数,然后在头脑中形成一个大概的轮廓,虽然有时候不是特别清晰;接着学习TIMER(通用定时器),只是学习了最简单的溢出中断,其他捕获什么的都还没有看呢--想先对stm有个总体的学习,下一步准备每个模块细细“研读”。应用定时器溢出中断做了个闪灯小程序;接着顺便把学习过的GPIO,EXTI,TIMER混在一起做了一个优先级(NVIC)的程序,以来了解下优先级,二来对前面的学习是一个复习,虽然很简单,但没能一下子就调出来--其实每次都会在细节上出不少差错:时钟忘使能啦,GPIO没有配置全啦,名称写错啦(很低级,但这个有时候真的不好找),概念理解不对啦。有时候憋的真是相当难受,但问题解决的那一刻真怎是一个“爽”字了得啊,当然前提是自己解决的;接下来学USART(串口),原来我也不知道有串口这么个东西,但弄单片机的要是不知道“串口”就好比开车的不知道轮胎一样了,开始完全没有概念,什么波特率啊,奇偶校验位啊,停止位啊,对着一堆名词看着都头大。慢慢的了解到串口是一种通讯传输方式,就和USB一样,只是串口比USB早出生好多年。这时候已经有点门了,看概念,抄例程,看函数,理解,根据自己的理解改参数,实现!学会了串口,以后就可以通过串口来观察数据了(我的实验板可是没有屏的);下一个是DMA,DMA可是个好东西,至于怎么好,百度一下,大家就知道了;下来ADC(模数转换),就是把模拟量转化成数字量,据说stm之所以强大,ADC算一个重要条件,我只是简单了应用了一个测电压的功能(可以说是ADC的最简单功能了),用串口显示探针(自己焊上去的)所测到的电压值,主要卡在了两个地方:1忘记配置串口的GPIO(所以一定要注意细节,一个细节能憋我1天)  2对通道的理解不够,原以为通道自己找串口(现在发现自己挺天真的),实际是每个通道对应自己的GPIO口,或模块(如温度传感器),“一知半解”又让我卡了1天。解决这两个问题后,串口赫然出现数字啦,而且是探地是0,探电源是33xx(3.3V的),还真准呢啊;现在在学习I2C(刚刚开始看),还在看概念。
       希望自己坚持下去,早日能写出一个属于自己的程序,完成一个说的过去的功能,下面把我的程序粘出来,和大家分享下,大虾看到了别见笑啊
注:1.有两个灯,PA4    B12,都是低电平点亮
       2.有两个按键,PB8  和  PB9,按下是低电平
       3.程序开始后两个灯常亮,按下按键后熄灭,抬起后继续亮

main.c中
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
void RCC_Configuration(void)  //时钟配置函数
{
   ErrorStatus HSEStartUpStatus;
    //使能外部晶振
   RCC_HSEConfig(RCC_HSE_ON);
   //等待外部晶振稳定
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
   //如果外部晶振启动成功,则进行下一步操作
   if(HSEStartUpStatus==SUCCESS)
   {
     //设置HCLK(AHB时钟)=SYSCLK  将系统时钟进行分频后,作为AHB总线时钟
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
     //PCLK1(APB1) = HCLK/2  将HCLK时钟2分频后给低速外部总线
     RCC_PCLK1Config(RCC_HCLK_Div2);
     //PCLK2(APB2) = HCLK  HCLK时钟配置给高速外部总线
     RCC_PCLK2Config(RCC_HCLK_Div1);
     //外部高速时钟HSE 4倍频
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
     //启动PLL
     RCC_PLLCmd(ENABLE);
     //等待PLL稳定
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     //系统时钟SYSCLK来自PLL输出
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     //切换时钟后等待系统时钟稳定
     while(RCC_GetSYSCLKSource()!=0x08);
   }
   // 下面这些都是外设总线上所挂的外部设备时钟的配置
   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
}
void GPIO_Configuration(void)  //GPIO配置函数
{
  //GPIO_DeInit(GPIOA);
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void EXTI_Config(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
  // 管脚选择
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
  // 清除 EXTI线路挂起位
  EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9);
  //
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_Line = EXTI_Line8|EXTI_Line9;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 注意名称是“_IRQn”,不是“_IRQChannel”
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{
RCC_Configuration();
GPIO_Configuration();
EXTI_Config();
NVIC_Config();

while(1)
{
   GPIO_ResetBits(GPIOB,GPIO_Pin_12);
   GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
}

中断文件  it.c中

void EXTI9_5_IRQHandler(void)
{
  if ( EXTI_GetITStatus(EXTI_Line8) != RESET )
  {
    EXTI_ClearITPendingBit(EXTI_Line8);
   
   
    GPIO_SetBits(GPIOA,GPIO_Pin_4);
        
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0);
      
  }
  
   if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
  {
    EXTI_ClearITPendingBit(EXTI_Line9);
   
    GPIO_SetBits(GPIOB,GPIO_Pin_12);
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0);
  }
}





库和函数。哪个好学。或者我该怎么选。我感觉库会不会简单些

我都是用库做的,感觉还行(很模块化);寄存器我没有看,感觉很灵活(操作难度大)。其实你可以用一个最简单的跑马灯分别用库和寄存器做一次,感觉感觉。
个人感觉先用库会利于理解记忆。

谢谢分享

感觉还是晕啊,我还是好好学学基础的吧

这个比起51怎么这么复杂

学习了菜鸟飘过

很好的感受,真心向你学习。

刚学STM32的飘过

当初是学寄存器的 现在连个程序都写不出 只能偷老码农的菜了

程序 挺好的   。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top