<meta name="keywords" content="必胜时时彩开户,keywords" /> [原创]STM32单片机的学习履历 联系我们

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

  随便写写,关于stm32 比来在学习stm32,写点器械,虽然质朴,但都是原创啊

  开发板是先进画的,似乎是用来测试一个3G功效的,不外关于我来讲太远;我要来了3个,自己焊了一个最小系统,幸亏公司资源照样不错的,器件芯片有,还可以问问先进--对公司照样较量知足的,虽然人为少了点,但学器械第一名O(∩_∩)O~。
        最泉源虽然是建工程了,这个真不太会,前前后后竟用了一周(时间真长,别见笑啊),上彀查质料, 问先进,自己推想。。。总算弄定,然后从GPIO泉源学,泉源还真没甚么眉目(虽然在年夜学学点51,但完全没有真正应用,顶多是赛马灯实验),泉源纠结是从存放器泉源学照样从库函数泉源学,厥后看到一句“用库函数入门,用存放器前进”因此下定决计用库,但其时没有库的看法,效果走了许多弯路,看了许多不须要的器械,其时竟没明确到只是挪用库就OK了,其他不用管。最后潜心的在mamjap.com教程网看完一个例程后照猫画虎写了一个,经由了一再再三调试以后,灯事实亮了!谁人兴奋啊。再次还要谢谢 http://mamjap.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);
  }
}