5-STM32最小系统板(江科大)

标准库

输入输出模式

3-1:GPIO可配置为8种输入输出模式

输出模式也就是想要单片机给电平是高是低,应用于LED、蜂鸣器、模拟通信协议输出时序 ;

输入时序可以用于按键读取、模拟通信协议接收数据;

开漏输出模式:在给寄存器为0的时候,由于在给Io输出的过程中有两个mos管,故要io得到低电平的话,上面的高电平要关闭就是完全关闭,故此时只有低电平有驱动能力,这个常用于iic的通信协议驱动方式,因为这个在多机通信中也能不受其他通信设备的干扰;

斯密特触发器:如果外界输入的是抖动的波形,不那么完美,就可以利用这个高于某一个阈值(可以自己设定)就全部为高电平;相反则低,在中间就继续保持上一个电平;如果没有这个触发器就可能因为有干扰而导致误判。

LED的1k电阻说不定不是为了保护LED,而是也有限流,让io那边电压小一点,这样和3.3的电压差就比较大,才能让灯更加亮

3-2:根据接线图直接自己编写:

首先对于头文件,可以直接写上main.h,不过要先保证有stm32f10x.h(这个是外设寄存器的描述文件)&&为什么要先从GPIO开始定义呢,看哪个框图,下面两个图对应起来,在外设寄存器的描述中会带有系统时钟的定义:

要找哪个外设就去library定义下的哪个.h里面找

3-3:代码编写(own):需要什么功能的函数,直接看名字;这一个的命名总会重复前面选项的名字:

传感器模块:传感器元件的电阻会随外界模拟量的变化而变化,再通过与外接的一个电阻分压得出传感器的模拟电压,再通过电压比较器二值化输出;

如果传感器只是仅仅接收0或者1,需要置以什么模式:这个相当于按键那样判断,输入的是0还是1,所以用上拉;GPIO_Mode_IPU

3-4debug调试:

图一:黄色那行的一个框框是C语言组成的汇编语言,可以看一看每一句C实际都执行了哪些操作;左边的窗口是寄存器组和状态标志位等信息;行数左边的那个可以设置断点,在点击全速运行之后程序就会一直运行,直到断点之后停下(这个功能查自己程序bug,也可以拷贝别人代码理解别人程序运行流程);点击RST,最左边的图标,程序就会回到最开始的地方。如果不知道程序怎么运行的,就可以单步debug一步步走它的允许逻辑;

图二:而对于一些小窗口:黄色logo右边的第三个,是符号窗口,在这里可以实时查看程序中所有变量的值,之后一步步找到那个值之后,想看一下结构体成员值的变化,可以直接右键,添加到Watch1窗口(就会出现在右下方的框框里面)

图三:也可以点击Peripherals中的System Viewers中GPIO ,然后GPIOA外设中的所有寄存器值就可以右框显示了,如果运行了之后,选择比如亮灯的PA0,我们就可以点开ODR0,选中打✓,之后就可以看见ODR里面最后一个数字是由0x000A000变0x000A001,由0x000A001变0x000A000

3-5 EXTI:使用NVIC统一管理中断,每个中断通道都具有16个可编辑的优先级,可对优先级进行分组,从而进一步设置抢占优先级和响应优先级。中断优先级组别这个还是得靠例子去贯通:

解析:也就是中断7和3可以打断中断6(因为排队排得早,而这两个又因为7的响应优先级小所以先一步去做),中断3和7不可以打断对方(抢占就是排队看能不能早一步谁打断谁的过程,而响应就是去做了,所以要做就直接先一步做完再说,就不可以打断对方)。

初始化步骤:GPIO---EXTI中断线---NVIC优先级组合---最后,外部中断信号就能进入CPU了 (EXTI是属于与总线相连的,所以也是需要在...gpio.h里面找函数)

总结:打开外设(在...gpio.h里面找)---初始化 xxxx_InitTypeDef xxxx__InitStructure;----然后xxxx_InitStructure. = ;xxxx_InitStructure. = ;xxxx_InitStructure. = ;之后xxxx_Init(&xxxx__InitStructure );

中断向量表在startup_stm32f10x_md.s中查询名称,中断号9-5,15-10的是一起的,0-4有分别的表示方式 && NVIC的第一个参数,通道查询的中断向量值是在stm32f10x.h中,而不是...it.h中的:

实际应用:

  • 总体思路:GPIOB---AFIO---EXTI---NVIC---中断函数
  • 具体拟写:在中断函数里面,一般都是先进行一个中断标志位的判断:先看一下是不是进入我们中断线的中断,所以就有了if(EXTI_GetITStatus(EXTI_Line14)==SET),如果是的话,就可以执行中断程序了;
  • 最后,中断程序结束后,一定要再调用一下清除中断标志位( EXTI_ClearITPendingBit(EXTI_Line14) )的函数,因为只有中断标志位置1了,程序就会跳转到中断函数;如果不清除中断标志位,那它就会一直申请中断,继而这样程序就会不断响应中断,执行中断函数,那程序就卡死在中断函数了,所以主函数下面的那些程序都没能执行。
  • 如果要看有没有进到中断,可以在if判断的那行加一个断点,然后在对射式红外传感器中卡一下,就会触发到它的中断线,之后断点那里就会有一个黄色的光标跟着移动在那里,如下两图:

  • 如果确保可以进入中断了,那么就可以在主函数里面写显示加加的函数了

TIP:

实际测试:上升沿和下降沿触发在这个例程体现的是:下降沿的时候遮挡时会++,上升沿的是遮挡完才会++;如果是上升沿和下降沿都触发,那就会+2;

3-6旋转编码器:

如何判断旋转器是正向还是反向的方法:正向的时候波形A是低电平的时候,B是高电平;反向时A是高,B就是低,以此就能区分旋转方向了。所以就是也要让A和B同时触发中断,例如在A相下降沿和B相低电平时,才判断为反转,这样就能保证正反转都转到位了,才执行数字加减的操作。

这一个有专门保存数值的函数:

TIM_GetCounter,记录计数值

TIP:

  • c8t6的意思是c---0x30(char类型只取一个字节,这个是十六进制)->48(十进制整数),故c就代表48pin;8->64k;封装;温度
  • 复位电路:复位电路的目的就是在上电的瞬间提供一个与正常工作状态下相反的电平。一般利用电容电压不能突变的原理,将电容与电阻串联,上电时刻,电容没有充电,两端电压为零,此时,提供复位脉冲(由总线控制器提供的APB1或者APB2,也就是RCC的函数),电源不断的给电容充电,直至电容两端电压为电源电压,电路进入正常工作状态。
  • NVIC是内核的外设,所以不需要开启RCC时钟,而RCC管的是内核外的外设
  • 在主程序中查看和清除标志位,就用下图中的上面两个函数,如果是在中断里面查看和清除,就用下面的两个函数:

  • 最好不要在中断函数和主函数调用相同的函数或者操作同一个硬件,比如OLED,在原本主函数里面写的是第一行,在中断里面是第四行,所以返回去的时候没有对原本的现场保护,不能保证还是在第一行继续写显示;可以像定义一个值,赋值出来显示

3-7定时器:

定时器可以对输入的时钟进行计数,并且当计数值达到设定值时触发中断;16位计数器在72M计数时钟下可以实现59.65S的定时

c8t6只有TIM1-TIM4

初始化框图:

开启内部时钟来计时:

如果仅仅是定时就不用到OC(output compare)输出比较

用TIM_InternalClockConfig(TIM2);开启时钟

开启外部时钟来计时:

用框图对应程序解析:

TIM_ITConfig()是对应中断输出控制的部分;

解析:定时器是定时器,中断是中断,所以还是要相连的,根据这行代码就可以更新中断到NVIC的通路了

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

解析:这一句主要是为了上一句TIM_TimeBaseInit(TIM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值