(玩电子) 电子技术学习与研讨
其时方位:单片机教程网 >> MCU规划实例 >> 阅览文章

[原创]STM32单片机的学习经历

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

  随意写写,关于stm32 最近在学习stm32,写点东西,尽管简略,但都是原创啊

  开发板是长辈画的,好像是用来测验一个3G功用的,不过关于我来说太远;我要来了3个,自己焊了一个最小体系,好在公司资源仍是不错的,器材芯片有,还能够问问长辈--对公司仍是比较满意的,尽管薪酬少了点,但学东西第一位O(∩_∩)O~。
        最开端当然是建工程了,这个真不太会,前前后后竟用了一周(时刻真长,别见笑啊),上网查材料, 问长辈,自己揣摩。。。总算搞定,然后从GPIO开端学,开端还真没什么条理(尽管在大学学点51,但彻底没有真实运用,顶多是跑马灯试验),开端纠结是从寄存器开端学仍是从库函数开端学,后来看到一句“用库函数入门,用寄存器进步”所以下定决心用库,但其时没有库的概念,成果走了许多弯路,看了许多不必要的东西,其时竟没了解到仅仅调用库就OK了,其他不必管。最终悉心的在www.62pa.com教程网看完一个例程后照本宣科写了一个,经过了屡次调试今后,灯总算亮了!那个振奋啊。再次还要感谢 http://www.62pa.com/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);
  }
}

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

相关文章