初学者即将毕业实习,希望利用最后两个月的学习顺利找到工作,占个地方做些笔记O(∩_∩)O哈哈~

2019-07-20 23:27发布

本帖最后由 229382777@qq.com 于 2017-2-28 10:58 编辑

        买了原子的mini开发板快一年了,一直都是断断续续的学,学习进度经常被打断,导致现在连前面的知识也忘的差不多了,自身学习的条件可能没有大学生好,即将面临毕业实习,希望在最后这两个月能把mini教程全部过完并掌握,争取出去后能适应的了这方面的工作。在此借原子哥的宝地一用,也方便自己日后的复习,学习过程中可能会出现挺多错误的地方,也希望大家能帮忙指出其中错误的地方。为了保证自己的身体健康,不忙的情况下一般都会晚上9点前进行更新,每天会坚持去操场跑步。希望各位也注重身体健康,身体是革命的本钱O(∩_∩)O!

目录

所在页数 所在楼层楼层主题 1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
3
3
3
3
3
3
3
3
4
4
4
4
4
4
4
4
4
4
4
42#  
20#
25#
32#
38#
41#
44#
46#
54#
59#
60#
63#
71#
78#
85#
86#
100#
106#
110#
117#
122#
134#
144#
148#
152#
154#
155#
158#
163#
164#
167#
171#
173#
176#
185#
189#之后硬件篇
SYSTEM文件部分(一)
SYSTEM文件部分(二)
LED灯
按键
串口
外部中断
独立、窗口看门狗
定时器中断
PWM互补输出及死区时间
输入捕获
OLED
LCD
LCD(二)
RTC
待机唤醒
ADC
内部温度传感器
DAC
DMA
IIC
SPI
触摸屏
FLASH模拟EEPROM
内存管理
SD卡
FATFS
汉字显示实验
图片显示
IAP
触控USB鼠标实验
M3内核基础知识
UCOS任务调度
UCOS信号量和邮箱
消息队列、信号量、软件定时器
知识点分享
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
55条回答
it_do_just
1楼-- · 2019-07-26 21:41
 精彩回答 2  元偷偷看……
it_do_just
2楼-- · 2019-07-27 02:53

实战:外部中断

 

前面SYSTEM(二)有过一部分中断的总结了,这里再补充一下

 

EXTI控制器的主要特性如下:
● 每个中断/事件都有独立的触发和屏蔽
● 每个中断线都有专用的状态位
● 支持多达20个软件的中断/事件请求
● 检测脉冲宽度低于APB2时钟宽度的外部信号。

 

要把 IO 口作为外部中断输入,有以下几个步骤:

1)初始化 IO 口为输入。
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。(需要启动复用时钟)
3)开启与该IO口相对的线上中断/事件,设置触发条件。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。



[mw_shl_code=c,true]//外部中断初始化程序 //初始化PA0,PC5,PA15为中断输入. void EXTI_Init(void) { KEY_Init(); //设置时钟以及IO口 Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 Ex_NVIC_Config(GPIO_C,5,FTIR); //下降沿触发 Ex_NVIC_Config(GPIO_A,15,FTIR); //下降沿触发 MY_NVIC_Init(2,2,EXTI0_IRQn,2); //抢占2,子优先级2,组2 MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); //抢占2,子优先级1,组2 MY_NVIC_Init(2,0,EXTI15_10_IRQn,2); //抢占2,子优先级0,组2 } //外部中断配置函数 //只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个 //参数: //GPIOx:0~6,代表GPIOA~G //BITx:需要使能的位; //TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发 //该函数一次只能配置1个IO口,多个IO口,需多次调用 //该函数会自动开启对应中断,以及屏蔽线 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) { u8 EXTADDR; u8 EXTOFFSET; EXTADDR=BITx/4;//得到中断寄存器组的编号,AFIO_EXTICR分4组分别代表16个IO,EXTADDR代表哪个组(1~4) EXTOFFSET=(BITx%4)*4; //一个IO占4个位,EXTOFFSET用于指定哪个IO RCC->APB2ENR|=0x01;//使能io复用时钟 AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!! AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx //对应库函数:GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); //自动设置 EXTI->IMR|=1<<BITx;// 开启line BITx上的中断请求 if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发 if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发 } //设置NVIC //NVIC_PreemptionPriority:抢占优先级 //NVIC_SubPriority :响应优先级 //NVIC_Channel :中断编号 //NVIC_Group :中断分组 0~4 //注意优先级不能超过设定的组的范围!否则会有意想不到的错误 //组划分: //组0:0位抢占优先级,4位响应优先级 //组1:1位抢占优先级,3位响应优先级 //组2:2位抢占优先级,2位响应优先级 //组3:3位抢占优先级,1位响应优先级 //组4:4位抢占优先级,0位响应优先级 //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) { u32 temp; MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组 temp=NVIC_PreemptionPriority<<(4-NVIC_Group);//4代表0~4五组,抢占优先级占几位这里左移几位(在高2位) temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);//响应优先级占几位,这里就右移几位(在低2位) temp&=0xf;//取低四位 NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK) NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级,配置高4位 } //设置NVIC分组 //NVIC_Group:NVIC分组 0~4 总共5组 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) { u32 temp,temp1; temp1=(~NVIC_Group)&0x07;//取后三位 temp1<<=8; temp=SCB->AIRCR; //读取先前的设置 temp&=0X0000F8FF; //清空先前分组 temp|=0X05FA0000; //写入钥匙 temp|=temp1; SCB->AIRCR=temp; //设置分组 } [/mw_shl_code]


龙之谷
3楼-- · 2019-07-27 06:49


(字符补丁)
it_do_just
4楼-- · 2019-07-27 11:03
 精彩回答 2  元偷偷看……
it_do_just
5楼-- · 2019-07-27 11:42
顺便跟原子哥提个建议,排版的难度有点大啊,有时候按回车会自动跳回顶部,然后又要手动拉下来,感觉挺麻烦的,希望新的论坛可以改进排版,尽量把排版变得简单些
正点原子
6楼-- · 2019-07-27 14:54
回复【47楼】229382777@qq.com:
---------------------------------
新论坛会改善的.

一周热门 更多>