commit 2adb3aafb81daecb828d36f34e421f890b34ba53 Author: 张渊 <1144073284@qq.com> Date: Fri Apr 8 15:38:05 2022 +0800 first diff --git a/20220328.md b/20220328.md new file mode 100644 index 0000000..0cc5e26 --- /dev/null +++ b/20220328.md @@ -0,0 +1,38 @@ +# 任务安排 + + + +## 任务 + +``` +今日任务: +2.完成硬件测试。 +3.完成项目开发。 + + +``` + + + +## 时间消耗 + +以一个小时为单位 + +| 时间 | 做了什么 | | | | | +| :---- | ------------ | ---- | ---- | ---- | ---- | +| 9-10 | 听讲 | | | | | +| 10-14 | 硬件测试 | | | | | +| 14-15 | 测试文档编写 | | | | | +| | | | | | | + +## 总结 + +``` +完成了硬件安装 + +``` + + + + + diff --git a/20220329.md b/20220329.md new file mode 100644 index 0000000..7abac93 --- /dev/null +++ b/20220329.md @@ -0,0 +1,37 @@ +# 任务安排 + + + +## 任务 + +``` +今日任务: +阅读key代码 + + +``` + + + +## 时间消耗 + +以一个小时为单位 + +| 时间 | 做了什么 | | | | | +| :---- | ---------------- | ---- | ---- | ---- | ---- | +| 9-12 | 阅读代码 | | | | | +| 12-14 | 完成毕设原理图 | | | | | +| 14-18 | 阅读代码,并实验 | | | | | +| | | | | | | + +## 总结 + +``` + + +``` + + + + + diff --git a/20220330.md b/20220330.md new file mode 100644 index 0000000..7286db8 --- /dev/null +++ b/20220330.md @@ -0,0 +1,36 @@ +# 任务安排 + + + +## 任务 + +``` +今日任务: +阅读整体代码 + +``` + + + +## 时间消耗 + +以一个小时为单位 + +| 时间 | 做了什么 | +| :---- | ---------------------------------------- | +| 9-11 | 理解按键模块代码 | +| 11-12 | 理解c #,#@,##使用方法 | +| 14-15 | KEIL下如何准确测量代码执行时间,动态数组 | +| 16-18 | 阅读代码 | + +## 总结 + +``` + + +``` + + + + + diff --git a/20220331.md b/20220331.md new file mode 100644 index 0000000..62a63e0 --- /dev/null +++ b/20220331.md @@ -0,0 +1,110 @@ +# 任务安排 + + + +## 任务 + +``` +今日任务: +阅读整体代码 + +``` + + + +## 时间消耗 + +以一个小时为单位 + +| 时间 | 做了什么 | +| :---- | --------------- | +| 9-12 | 阅读整体代码 | +| 13-14 | 理解systick实现 | +| | | +| | | + +## 总结 + +``` +--------------------------------------------------------------------------------------------------------- +main---->unused_gpio_init() + ---->gpio_init() ----->led_gpio_init() --->GPIO_SET(a,22,!,state) + -->GPIOwrite(gpio_pin##pin,! state ? 1:0 ) //原理图为低电平点亮 + ------>key_gpio_init() + ---->t16_pa4_init()---->设置pwm输出 + ---->按键初始化zkey_init(&key_module) ----> key_module 定义为zkey_module_t 类型,初始化利用s_keys,onkey完成初始化。z_module_t中的void (*onkey)(zkey_t *key,zkey_state_t key_state),为函数指针,在s_key中完成初始化,s_keys[0] = "time key",port_gpio_get_timer_key_state + s_keys[1] = "gears key",port_gpio_get_gears_key_state + s_keys[2] = "interval key",.......... + s_keys[3] = "switch key", ........... + 按键初始化理解:skey_t初始化的函数仅仅是对每个按键调用的,处理的是按键状态,key_module中的是整个按键模块使用,处理的是按键逻辑。 + 例如,一个返回值为bool量的函数指针,结构中初始化为指向所需函数,详细见图1. + + starting up--->开机标志,定时关闭,-->update_ozone_work_level更新工作等级。 + 等级低:关闭风扇,占空比0,频率1 + 等级中: + 等级高:设置频率,根据频率计算占空比。打开rgb灯。 + 是否间隔工作(逻辑待看)。。 + + + ---->初始化完毕,开机。 + ----->轮询do_it_each_ms,每1ms进入中断,全局变量加1。-->通过端口port_haspassed_ms得知已经过去的时间,如果大于设定time。就把比较值更新。((超时问题请见下图,,,)) + + while(1) + { + debug灯轮询;200ms + + + key轮询 + { + port_gpio_get_timer_key_state <-------->each->get_key_state(); + 判断是否是当前状态是否和上次相同,如果相同并且保持一个周期, 那么进行滤波处理。(其中,上次last_io和after_filter已经初始化完成,为上电读取状态。) + 之后送入滤波处理,得到上升,下降,保持); + 滤波处理----》如果当前状态不是上个状态,说明状态改变。如果当前状态是1,说明之前没按下,但经历了上升沿,进行初始化。 + 不然对从1-》0是下降沿,初始化按键。 + 都不是的话,当前状态为持续按下按键。 + 以上都送入onkeyh + } + + + + } + + + + g_systick_time = 0; //全局时间变量 + void sys_tick_irq{ + g_systick++; + } + void get_systick(return g_systick); + + int delay_ms(uint32_t time) + { + now_time = get_systick(); + + if(now_time > time) + return nowtime-time; + } + + void doit_each_ms(int time) + { + int has_passed = delay_ms(time); + if(haspassed > time) + } + intmain + { + doit_eahcms(200); + } + +``` + + + +![image-20220331171159926](C:\Users\zwsd_cad3\Desktop\zhangyuan_task\新日记\markdown.assets\$(filename).assets\image-20220331171159926.png) + + + +![image-20220331170533223](C:\Users\zwsd_cad3\Desktop\zhangyuan_task\新日记\markdown.assets\$(filename).assets\image-20220331170533223.png) + + + +![image-20220331171317924](C:\Users\zwsd_cad3\Desktop\zhangyuan_task\新日记\markdown.assets\$(filename).assets\image-20220331171317924.png) diff --git a/20220402.md b/20220402.md new file mode 100644 index 0000000..c09a04e --- /dev/null +++ b/20220402.md @@ -0,0 +1,125 @@ +# 任务安排 + + + +## 任务 + +``` +今日任务: +阅读整体代码 + +``` + + + +## 时间消耗 + +以一个小时为单位 + +| 时间 | 做了什么 | +| :---- | --------------- | +| 9-12 | 阅读整体代码 | +| 13-14 | 理解systick实现 | +| | | +| | | + +## 总结 + +``` +--------------------------------------------------------------------------------------------------------- +main---->unused_gpio_init() + ---->gpio_init() ----->led_gpio_init() --->GPIO_SET(a,22,!,state) + -->GPIOwrite(gpio_pin##pin,! state ? 1:0 ) //原理图为低电平点亮 + ------>key_gpio_init() + ---->t16_pa4_init()---->设置pwm输出 + ---->按键初始化zkey_init(&key_module) ----> key_module 定义为zkey_module_t 类型,初始化利用s_keys,onkey完成初始化。z_module_t中的void (*onkey)(zkey_t *key,zkey_state_t key_state),为函数指针,在s_key中完成初始化,s_keys[0] = "time key",port_gpio_get_timer_key_state + s_keys[1] = "gears key",port_gpio_get_gears_key_state + s_keys[2] = "interval key",.......... + s_keys[3] = "switch key", ........... + 按键初始化理解:skey_t初始化的函数仅仅是对每个按键调用的,处理的是按键状态,key_module中的是整个按键模块使用,处理的是按键逻辑。 + 例如,一个返回值为bool量的函数指针,结构中初始化为指向所需函数,详细见图1. + + starting up--->开机标志,定时关闭,-->update_ozone_work_level更新工作等级。 + 等级低:关闭风扇,占空比0,频率1 + 等级中: + 等级高:设置频率,根据频率计算占空比。打开rgb灯。 + 是否间隔工作(逻辑待看)。。 + + + ---->初始化完毕,开机。 + ----->轮询do_it_each_ms,每1ms进入中断,全局变量加1。-->通过端口port_haspassed_ms得知已经过去的时间,如果大于设定time。就把比较值更新。((超时问题请见下图,,,)) + + while(1) + { + debug灯轮询;200ms + + + key轮询 + { + port_gpio_get_timer_key_state <-------->each->get_key_state(); + 判断是否是当前状态是否和上次相同,如果相同并且保持一个周期, 那么进行滤波处理。(其中,上次last_io和after_filter已经初始化完成,为上电读取状态。) + 之后送入滤波处理,得到上升,下降,保持); + 滤波处理----》如果当前状态不是上个状态,说明状态改变。如果当前状态是1,说明之前没按下,但经历了上升沿,进行初始化。 + 不然对从1-》0是下降沿,初始化按键。 + 都不是的话,当前状态为持续按下按键。 + 以上都送入onkeyh + } + + + + } + + + + g_systick_time = 0; //全局时间变量 + void sys_tick_irq{ + g_systick++; + } + void get_systick(return g_systick); + + int delay_ms(uint32_t time) + { + now_time = get_systick(); + + if(now_time > time) + return nowtime-time; + } + + void doit_each_ms(int time) + { + int has_passed = delay_ms(time); + if(haspassed > time) + } + intmain + { + doit_eahcms(200); + } + +now_io ---- ------ ----- + | _____ | | + ---- ----- +last_real ____ | _____ | _ | + +last_io ---- ------ ----- + | _____ | | + +after_filter ---- ------ ----- + | _____ | | + + -下降沿- -上升沿- +原因:lastreal 没变,导致after——filter没变,从而导致仅仅变化一次。 + + +``` + + + +![image-20220331171159926](C:\Users\zwsd_cad3\Desktop\zhangyuan_task\新日记\markdown.assets\$(filename).assets\image-20220331171159926.png) + + + +![image-20220331170533223](C:\Users\zwsd_cad3\Desktop\zhangyuan_task\新日记\markdown.assets\$(filename).assets\image-20220331170533223.png) + + + +![image-20220331171317924](C:\Users\zwsd_cad3\Desktop\zhangyuan_task\新日记\markdown.assets\$(filename).assets\image-20220331171317924.png) diff --git a/20220407.md b/20220407.md new file mode 100644 index 0000000..7388fc9 --- /dev/null +++ b/20220407.md @@ -0,0 +1,212 @@ + + + + + + +# 任务安排 + +## 任务 + +``` +任务:先总结知识点,后每个知识点找两篇博客。 + +``` + +## 知识点 + +``` +知识点--1:typedef类型的用法, 1.https://blog.csdn.net/sruru/article/details/7916296/(教学详细) + 2.https://blog.csdn.net/helaisun/article/details/54845891(例程丰富) + +知识点--2:二重指针与指针数组 1.https://blog.csdn.net/Zorro721/article/details/107304645(教学详细) + 2//zhidao.baidu.com/question/2205614253334274268.html(教学详细) + +知识点--3:DMA 1.https://blog.csdn.net/wuyongpeng0912/article/details/46634931 + 2.https://www.jianshu.com/p/b19a7c46f465 + +知识点--4:芯片启动流程 1.https://blog.csdn.net/qq_46359697/article/details/115255840 + 2.https://blog.csdn.net/weixin_43593698/article/details/108303376 + +知识点--5:sscanf函数的使用 1.https://baike.baidu.com/item/sscanf/10551550?fr=aladdin + 2.https://www.runoob.com/cprogramming/c-function-sscanf.html + +知识点--6:uint32_t的溢出 1. https://wenku.baidu.com/view/804921cb5df7ba0d4a7302768e9951e79b8969ae.html + +知识点--7:解耦与耦合 1.https://blog.csdn.net/nanhuaibeian/article/details/106059409 + 2.https://www.cnblogs.com/zhjblogs/p/14221560.html + +知识点--8:查询法和中断法区别 1https://bbs.csdn.net/topics/370263037 + +``` + +## 总结 + +![image-20220408114237348](markdown.assets/20220407.assets/image-20220408114237348.png) + +``` +FUNC1和FUNC2定义为返回值为int的,参数为(int)的整型和 返回值为int,参数为(int*, int*, int*) 的类型; +—————————————————————————————————————————————— +—————————————————————————————————————————————— +``` + +![image-20220408114614631](markdown.assets/20220407.assets/image-20220408114614631.png) + +``` +2.函数指针类型的用法 + +函数名Max就是调用这个函数的入口地址。就如同定义一个数组,这个数组名就是这个数组的首地址。 +既然是地址,就可以使用一个指针来指向它。 +对应于int Max(int x, int y),定义的函数指针如下: +与函数声明类似,int(*p)中的int代表函数的返回值类型为int; +括号内的两个int代表参数列表; +这里的*代表声明的是函数指针; +不可将括号忘掉,否则表示声明的是一个函数,返回值类型为int* ; + +——————————————————————————————————————————————— +——————————————————————————————————————————————— +``` + +![image-20220408103243419](markdown.assets/20220407.assets/image-20220408103243419.png) + +![image-20220408103308708](markdown.assets/20220407.assets/image-20220408103308708.png) + +```c +//3.二重指针与指针数组 + + char buf[100]; + char** spliteresult1; + char* ordersplit_result[10]; + spliteresult1 = ordersplit_result; + spliteresult1[0] = ordersplit_result[0]; + ordersplit_result[0] = "first"; + ordersplit_result[1] = "second"; + +// **spiteresult1是指向 ordersplit_result指针数组中的内容,*ordersplit_result是指向数组的内容的首地址,ordersplit_result是二重指针地址,*ordersplit_result是二重指针地址里面的值。 +// 下图中,将ordersplit_result的地址赋给splitresult,*spliterresult是buf的首地址,spliteresult[off]中存放的是每个分割完后下一个字符串开头的首地址。 +``` + + + +![img](markdown.assets/20220407.assets/472715174931162.jpg) + +```c +//4.DMA +Direct Memory Access(存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中CPU可以进行其他的工作(前提是未设置停止CPU访问)。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高”。 + +DMA传送方式是让存储器与外设、或外设与外设之间直接交换数据,不需要经过CPU的累加器中转,减少了这个中间环节,并且内存地址的修改、传送完毕的结束报告都是由硬件电路实现的,因此大大地提高了数据的传输速度。一个DMA传送只需要执行一个DMA周期,相当于一个总线读写周期。 + +DMA是在专门的硬件( DMA)控制下,实现高速外设和主存储器之间自动成批交换数据尽量减少CPU干预的输入/输出操作方式。 + +``` + + + +![img](markdown.assets/20220407.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjc3ODE1,size_16,color_FFFFFF,t_70#pic_center.png) + +``` +5.芯片启动流程 +①上电后硬件设置SP、跳转到 Reset_Hander + +②设置系统时钟(SystemInit) + +③软件设置SP + +④加载.data、.bss,并初始化栈区(__main) + +⑤跳转到C文件的main函数 + +值得注意的是:Keil编译完成后: + +Code:代表程序代码段 + +RO_DATA:代表只读数据段 + +RW_DATA:代表已经初始化全局数据 + +ZI_DATA:代表未初始化全局数据 + +由于程序在 FLASH 中直接通过总线进行访问,程序运行在 FLASH 上,而可更改的数据存于 SRAM 中,故: + +RO_SIZE = Code + RO_DATA(占用 Flash ) + +RW_DATA = RW_DATA + ZI_DATA(占用 SRAM) + +ROM_SIZE = Code + RO_DATA + RW_DATA ( 烧写到 FLASH 大小空间 ) + +针对 ZI 数据,是不存 FLASH 中,直接在 SRAM 中初始化为 0 +``` + +```c +6.sscanf的使用 +#include +#include +#include + +int main() +{ + int day, year; + char weekday[20], month[20], dtm[100]; + + strcpy( dtm, "Saturday March 25 1989" ); + sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year ); + + printf("%s %d, %d = %s\n", month, day, year, weekday ); + + return(0); +} +声明 +下面是 sscanf() 函数的声明。 + +int sscanf(const char *str, const char *format, ...) +参数 +str -- 这是 C 字符串,是函数检索数据的源。 +format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。 +format 说明符形式为 [=%[*][width][modifiers]type=],具体讲解如下: +参数 描述 +* 这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。 +width 这指定了在当前读取操作中读取的最大字符数。 +modifiers 为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x) 或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g) +type 一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。 + +``` + + + + + +![img](markdown.assets/20220407.assets/424.png) + +``` +7.解耦与耦合 +什么是耦合、解耦 +一、耦合(可以称为关联性) +1、耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。 +2、在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。 +3、分类:有软硬件之间的耦合,还有软件各模块之间的耦合。耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。 +二、解耦 +1、解耦,字面意思就是解除耦合关系。 +2、在软件工程中,降低耦合度即可以理解为解耦,模块间有依赖关系必然存在耦合,理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。 +3、设计的核心思想:尽可能减少代码耦合,如果发现代码耦合,就要采取解耦技术。让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降到最低,而不至于牵一发而动全身。原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写。 +4、观察者模式:观察者模式存在的意义就是「解耦」,它使观察者和被观察者的逻辑不再搅在一起,而是彼此独立、互不依赖。比如网易新闻的夜间模式,当用户切换成夜间模式之后,被观察者会通知所有的观察者「设置改变了,大家快蒙上遮罩吧」。QQ消息推送来了之后,既要在通知栏上弹个推送,又要在桌面上标个小红点,也是观察者与被观察者的巧妙配合 +``` + + + + + + + +``` +7.查询法和中断法区别 +中断程序在程序开始定义中断入口地址,初始化中必须打开中断允许位,程序运行时不用判断溢出状态位,溢出后硬件清零; + +查询方式在程序运行时必须判断溢出状态位,溢出后须软件清零。 + +查询方式,就是在主函数里面不停循环,查询端口状态,明显其弊端在于响应速度,在处理事件多,处理流程复杂,函数嵌套执行的情况下,由于处理不过来容易丢失事件。 + +举个例子,在电话用户接入系统里面,一个单片机管理1个电话端口的摘挂机,执行周期要求8ms,用查询的方式足够了,但是当电话增加到16个,用查询方式,效果就差了,曾出现过电话响起的时(12个电话齐呼),拿起话筒,电话还在振铃,明显处理不过来。 + +这个时候,有两个办法,一个采用中断方式,另一个采用更高效的CPU,明显前者只需要修改软件,后者需要增加硬件成本,还延长开发时间。 +``` + diff --git a/20220407.pdf b/20220407.pdf new file mode 100644 index 0000000..f9f83fe Binary files /dev/null and b/20220407.pdf differ diff --git a/DMA.md b/DMA.md new file mode 100644 index 0000000..046333a --- /dev/null +++ b/DMA.md @@ -0,0 +1,12 @@ +![image-20220408143414874](markdown.assets/DMA.assets/image-20220408143414874.png) + +``` +//4.DMA +Direct Memory Access(存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中CPU可以进行其他的工作(前提是未设置停止CPU访问)。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高”。 + +DMA传送方式是让存储器与外设、或外设与外设之间直接交换数据,不需要经过CPU的累加器中转,减少了这个中间环节,并且内存地址的修改、传送完毕的结束报告都是由硬件电路实现的,因此大大地提高了数据的传输速度。一个DMA传送只需要执行一个DMA周期,相当于一个总线读写周期。 + +DMA是在专门的硬件( DMA)控制下,实现高速外设和主存储器之间自动成批交换数据尽量减少CPU干预的输入/输出操作方式。 + +``` + diff --git a/DMA.pdf b/DMA.pdf new file mode 100644 index 0000000..5845a37 Binary files /dev/null and b/DMA.pdf differ diff --git a/markdown.assets/$(filename).assets/202233117512.bmp b/markdown.assets/$(filename).assets/202233117512.bmp new file mode 100644 index 0000000..713ebab Binary files /dev/null and b/markdown.assets/$(filename).assets/202233117512.bmp differ diff --git a/markdown.assets/$(filename).assets/image-20220331170533223.png b/markdown.assets/$(filename).assets/image-20220331170533223.png new file mode 100644 index 0000000..41daff0 Binary files /dev/null and b/markdown.assets/$(filename).assets/image-20220331170533223.png differ diff --git a/markdown.assets/$(filename).assets/image-20220331171159926.png b/markdown.assets/$(filename).assets/image-20220331171159926.png new file mode 100644 index 0000000..2976e60 Binary files /dev/null and b/markdown.assets/$(filename).assets/image-20220331171159926.png differ diff --git a/markdown.assets/$(filename).assets/image-20220331171317924.png b/markdown.assets/$(filename).assets/image-20220331171317924.png new file mode 100644 index 0000000..2e3bebb Binary files /dev/null and b/markdown.assets/$(filename).assets/image-20220331171317924.png differ diff --git a/markdown.assets/20220407.assets/424.png b/markdown.assets/20220407.assets/424.png new file mode 100644 index 0000000..7da0e71 Binary files /dev/null and b/markdown.assets/20220407.assets/424.png differ diff --git a/markdown.assets/20220407.assets/472715174931162.jpg b/markdown.assets/20220407.assets/472715174931162.jpg new file mode 100644 index 0000000..aa2e697 Binary files /dev/null and b/markdown.assets/20220407.assets/472715174931162.jpg differ diff --git a/markdown.assets/20220407.assets/image-20220408103243419.png b/markdown.assets/20220407.assets/image-20220408103243419.png new file mode 100644 index 0000000..036e477 Binary files /dev/null and b/markdown.assets/20220407.assets/image-20220408103243419.png differ diff --git a/markdown.assets/20220407.assets/image-20220408103308708.png b/markdown.assets/20220407.assets/image-20220408103308708.png new file mode 100644 index 0000000..f5a56df Binary files /dev/null and b/markdown.assets/20220407.assets/image-20220408103308708.png differ diff --git a/markdown.assets/20220407.assets/image-20220408114237348.png b/markdown.assets/20220407.assets/image-20220408114237348.png new file mode 100644 index 0000000..dd7a022 Binary files /dev/null and b/markdown.assets/20220407.assets/image-20220408114237348.png differ diff --git a/markdown.assets/20220407.assets/image-20220408114614631.png b/markdown.assets/20220407.assets/image-20220408114614631.png new file mode 100644 index 0000000..e4655f2 Binary files /dev/null and b/markdown.assets/20220407.assets/image-20220408114614631.png differ diff --git a/markdown.assets/20220407.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjc3ODE1,size_16,color_FFFFFF,t_70#pic_center.png b/markdown.assets/20220407.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjc3ODE1,size_16,color_FFFFFF,t_70#pic_center.png new file mode 100644 index 0000000..4666c52 Binary files /dev/null and b/markdown.assets/20220407.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjc3ODE1,size_16,color_FFFFFF,t_70#pic_center.png differ diff --git a/markdown.assets/DMA.assets/image-20220408143414874.png b/markdown.assets/DMA.assets/image-20220408143414874.png new file mode 100644 index 0000000..290a5d1 Binary files /dev/null and b/markdown.assets/DMA.assets/image-20220408143414874.png differ diff --git a/markdown.assets/typedef.assets/image-20220408135535382.png b/markdown.assets/typedef.assets/image-20220408135535382.png new file mode 100644 index 0000000..dd7a022 Binary files /dev/null and b/markdown.assets/typedef.assets/image-20220408135535382.png differ diff --git a/markdown.assets/typedef.assets/image-20220408141748397.png b/markdown.assets/typedef.assets/image-20220408141748397.png new file mode 100644 index 0000000..e27c746 Binary files /dev/null and b/markdown.assets/typedef.assets/image-20220408141748397.png differ diff --git a/markdown.assets/typedef.assets/image-20220408141812103.png b/markdown.assets/typedef.assets/image-20220408141812103.png new file mode 100644 index 0000000..fb43dfb Binary files /dev/null and b/markdown.assets/typedef.assets/image-20220408141812103.png differ diff --git a/markdown.assets/二重指针与指针数组.assets/image-20220408103243419.png b/markdown.assets/二重指针与指针数组.assets/image-20220408103243419.png new file mode 100644 index 0000000..036e477 Binary files /dev/null and b/markdown.assets/二重指针与指针数组.assets/image-20220408103243419.png differ diff --git a/markdown.assets/二重指针与指针数组.assets/image-20220408142019144.png b/markdown.assets/二重指针与指针数组.assets/image-20220408142019144.png new file mode 100644 index 0000000..f5a56df Binary files /dev/null and b/markdown.assets/二重指针与指针数组.assets/image-20220408142019144.png differ diff --git a/markdown.assets/二重指针与指针数组.assets/image-20220408143206002.png b/markdown.assets/二重指针与指针数组.assets/image-20220408143206002.png new file mode 100644 index 0000000..72a3b98 Binary files /dev/null and b/markdown.assets/二重指针与指针数组.assets/image-20220408143206002.png differ diff --git a/markdown.assets/芯片启动流程.assets/5950dcc1ad947c0b9b8bf210430edf51.png b/markdown.assets/芯片启动流程.assets/5950dcc1ad947c0b9b8bf210430edf51.png new file mode 100644 index 0000000..53f7b07 Binary files /dev/null and b/markdown.assets/芯片启动流程.assets/5950dcc1ad947c0b9b8bf210430edf51.png differ diff --git a/markdown.assets/芯片启动流程.assets/image-20220408145225880.png b/markdown.assets/芯片启动流程.assets/image-20220408145225880.png new file mode 100644 index 0000000..5f7d0a8 Binary files /dev/null and b/markdown.assets/芯片启动流程.assets/image-20220408145225880.png differ diff --git a/markdown.assets/芯片启动流程.assets/image-20220408151051998.png b/markdown.assets/芯片启动流程.assets/image-20220408151051998.png new file mode 100644 index 0000000..6b9b499 Binary files /dev/null and b/markdown.assets/芯片启动流程.assets/image-20220408151051998.png differ diff --git a/markdown.assets/解耦与耦合.assets/image-20220408151536159.png b/markdown.assets/解耦与耦合.assets/image-20220408151536159.png new file mode 100644 index 0000000..e32d522 Binary files /dev/null and b/markdown.assets/解耦与耦合.assets/image-20220408151536159.png differ diff --git a/sscanf.md b/sscanf.md new file mode 100644 index 0000000..3295c48 --- /dev/null +++ b/sscanf.md @@ -0,0 +1,32 @@ +```c +#include +#include +#include + +int main() +{ + int day, year; + char weekday[20], month[20], dtm[100]; + + strcpy( dtm, "Saturday March 25 1989" ); + sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year ); + + printf("%s %d, %d = %s\n", month, day, year, weekday ); + + return(0); +} +``` + +```c +int sscanf(const char *str, const char *format, ...) +参数 +str -- 这是 C 字符串,是函数检索数据的源。 +format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。 +format 说明符形式为 [=%[*][width][modifiers]type=],具体讲解如下: +参数 描述 +* 这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。 +width 这指定了在当前读取操作中读取的最大字符数。 +modifiers 为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x) 或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g) +type 一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。 +``` + diff --git a/sscanf.pdf b/sscanf.pdf new file mode 100644 index 0000000..6e37fba Binary files /dev/null and b/sscanf.pdf differ diff --git a/typedef.md b/typedef.md new file mode 100644 index 0000000..0268076 --- /dev/null +++ b/typedef.md @@ -0,0 +1,42 @@ +![image-20220408135535382](markdown.assets/typedef.assets/image-20220408135535382.png) + +``` +FUNC1和FUNC2定义为返回值为int的,参数为(int)的整型和 返回值为int,参数为(int*, int*, int*) 的类型; +—————————————————————————————————————————————— +—————————————————————————————————————————————— +``` + + + +```c +#include +int inc(int a) +{ + return(++a); +} + +int multi(int*a,int*b,int*c) +{ + return(*c=*a**b); +} + +typedef int(FUNC1)(int); +typedef int(FUNC2)(int*,int*,int*); + +void show(FUNC2 fun,int arg1, int*arg2) +{ + FUNC1 *p = &inc; + int temp =p(arg1); + fun(&temp,&arg1, arg2); + printf( "%d\n ",*arg2); +} + +int main() +{ + int a; + show(multi,10,&a); +} +``` + +![image-20220408141812103](markdown.assets/typedef.assets/image-20220408141812103.png) + diff --git a/typedef.pdf b/typedef.pdf new file mode 100644 index 0000000..60212ba Binary files /dev/null and b/typedef.pdf differ diff --git a/二重指针与指针数组.md b/二重指针与指针数组.md new file mode 100644 index 0000000..c9a5628 --- /dev/null +++ b/二重指针与指针数组.md @@ -0,0 +1,20 @@ +![image-20220408103243419](markdown.assets/二重指针与指针数组.assets/image-20220408103243419.png) + +![image-20220408142019144](markdown.assets/二重指针与指针数组.assets/image-20220408142019144.png) + +``` +3.二重指针与指针数组 + + char buf[100]; + char** spliteresult1; + char* ordersplit_result[10]; + spliteresult1 = ordersplit_result; + spliteresult1[0] = ordersplit_result[0]; + ordersplit_result[0] = "first"; + ordersplit_result[1] = "second"; + + **spiteresult1是指向 ordersplit_result指针数组中的内容,*ordersplit_result是指向数组的内容的首地址,ordersplit_result是二重指针地址,*ordersplit_result是二重指针地址里面的值。 + 图中,将ordersplit_result的地址赋给splitresult,避免了野指针的出现,*spliterresult是buf的首地址,spliteresult[off]中存放的是每个分割完后下一个字符串开头的首地址。 +``` + +![image-20220408143206002](markdown.assets/二重指针与指针数组.assets/image-20220408143206002.png) \ No newline at end of file diff --git a/二重指针与指针数组.pdf b/二重指针与指针数组.pdf new file mode 100644 index 0000000..06f4332 Binary files /dev/null and b/二重指针与指针数组.pdf differ diff --git a/查询法和中断法区别.md b/查询法和中断法区别.md new file mode 100644 index 0000000..1255cec --- /dev/null +++ b/查询法和中断法区别.md @@ -0,0 +1,12 @@ +7.查询法和中断法区别 +中断程序在程序开始定义中断入口地址,初始化中必须打开中断允许位,程序运行时不用判断溢出状态位,溢出后硬件清零; + +查询方式在程序运行时必须判断溢出状态位,溢出后须软件清零。 + +查询方式,就是在主函数里面不停循环,查询端口状态,明显其弊端在于响应速度,在处理事件多,处理流程复杂,函数嵌套执行的情况下,由于处理不过来容易丢失事件。 + +在不要求反应速度的情况下,可以使用查询法。否则,使用中断法。 + +举个例子,在电话用户接入系统里面,一个单片机管理1个电话端口的摘挂机,执行周期要求8ms,用查询的方式足够了,但是当电话增加到16个,用查询方式,效果就差了,曾出现过电话响起的时(12个电话齐呼),拿起话筒,电话还在振铃,明显处理不过来。 + +这个时候,有两个办法,一个采用中断方式,另一个采用更高效的CPU,明显前者只需要修改软件,后者需要增加硬件成本,还延长开发时间。 \ No newline at end of file diff --git a/查询法和中断法区别.pdf b/查询法和中断法区别.pdf new file mode 100644 index 0000000..51a9da3 Binary files /dev/null and b/查询法和中断法区别.pdf differ diff --git a/芯片启动流程.md b/芯片启动流程.md new file mode 100644 index 0000000..d5802ad --- /dev/null +++ b/芯片启动流程.md @@ -0,0 +1,48 @@ +![img](file://C:\Users\zwsd_cad3\Desktop\zhangyuan_task\%E6%96%B0%E6%97%A5%E8%AE%B0\markdown.assets\20220407.assets\watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjc3ODE1,size_16,color_FFFFFF,t_70%23pic_center.png?lastModify=1649399724) + + + +![img](markdown.assets/芯片启动流程.assets/5950dcc1ad947c0b9b8bf210430edf51.png) + + + +``` +5.芯片启动流程 +①上电后硬件设置SP、跳转到 Reset_Hander + +②设置系统时钟(SystemInit) + +③软件设置SP + +④加载.data、.bss,并初始化栈区(__main) + +⑤跳转到C文件的main函数 + +值得注意的是:Keil编译完成后: + +Code:代表程序代码段 + +RO_DATA:代表只读数据段 + +RW_DATA:代表已经初始化全局数据 + +ZI_DATA:代表未初始化全局数据 + +由于程序在 FLASH 中直接通过总线进行访问,程序运行在 FLASH 上,而可更改的数据存于 SRAM 中,故: + +RO_SIZE = Code + RO_DATA(占用 Flash ) + +RW_DATA = RW_DATA + ZI_DATA(占用 SRAM) + +ROM_SIZE = Code + RO_DATA + RW_DATA ( 烧写到 FLASH 大小空间 ) + +针对 ZI 数据,是不存 FLASH 中,直接在 SRAM 中初始化为 0 +``` + +![image-20220408145225880](markdown.assets/芯片启动流程.assets/image-20220408145225880.png) + +``` +https://www.bilibili.com/video/BV1ZB4y1A7nS/ +``` + +![image-20220408151051998](markdown.assets/芯片启动流程.assets/image-20220408151051998.png) \ No newline at end of file diff --git a/芯片启动流程.pdf b/芯片启动流程.pdf new file mode 100644 index 0000000..92c793b Binary files /dev/null and b/芯片启动流程.pdf differ diff --git a/解耦与耦合.md b/解耦与耦合.md new file mode 100644 index 0000000..6c84591 --- /dev/null +++ b/解耦与耦合.md @@ -0,0 +1,7 @@ +![image-20220408151536159](markdown.assets/解耦与耦合.assets/image-20220408151536159.png) + +``` +耦合(可以称为关联性),设计的核心思想:尽可能减少代码耦合,如果发现代码耦合,就要采取解耦技术。让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降到最低,而不至于牵一发而动全身。原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写。 +观察者模式:观察者模式存在的意义就是「解耦」,它使观察者和被观察者的逻辑不再搅在一起,而是彼此独立、互不依赖。比如网易新闻的夜间模式,当用户切换成夜间模式之后,被观察者会通知所有的观察者「设置改变了,大家快蒙上遮罩吧」。QQ消息推送来了之后,既要在通知栏上弹个推送,又要在桌面上标个小红点,也是观察者与被观察者的巧妙配合 +``` + diff --git a/解耦与耦合.pdf b/解耦与耦合.pdf new file mode 100644 index 0000000..494942a Binary files /dev/null and b/解耦与耦合.pdf differ