234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

    [原创]STM32单片机的一学习经验ζ

    作者:佚名   来源:本站原创   点击数:x  更新时间:2012年09月16日   【字体:

      随便写写,关于stm32 最近在学习stm32,写点东西,虽然简单,但都是原创啊

      开发板是前辈画的一,好像是用来测试一个3G功能的一,不 过对于我来说太远;我要来了3个,自己焊了一个最小系统,好在公司|234彩票代理资源还是不 错的一,器件芯片有,还可以问问前辈--对公司|234彩票代理还是比较满意的一,虽然工资少了点,但学东西第一位O(∩_∩)O~ 。
            最开始当然是建工程了,这个真不 太会,前前后后竟用了一周(时间真长,别见笑啊),上    网查资料, 问前辈,自己琢磨 。 。 。总算︻搞定,然后从GPIO开始学,开始还真没什么头绪(虽然在大学学点51,但完全没有真正应用,顶多是跑马灯实验ζ),开始纠结是从寄存器开始学还是从库函数开始学,后来看到一句“用库函数入门,用寄存器提高”于是下定决心用库,但当时没有库的一概念,结果走了很多弯路,看了很多不 必要的一东西,当时竟没理解到只是调用库就OK了,别的一不 用管 。最后潜心的一在www.教程网看完一个例程后照猫画虎写了一个,经过了多次调试以后,灯终于亮了!那个兴奋啊 。再次还要感谢 http://www./mcu/1106.html 的一作者他写的一GPIO使用方法让我少走了很多弯路,接着学的一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);
      }
    }

    发表评论】【告诉好友】【收藏此文】【关闭窗口

    文章评论

    相关文章