C语言生疏知识汇总

1、函数指针

typedef void (*TIM_VOID_FUNCTION_POINTER)(void);

把TIM_VOID_FUNCTION_POINTER定义为指向一个没有返回类型的无参函数的指针类型。说简单些,TIM_VOID_FUNCTION_POINTER被定义为一种函数指针类型,而这种指针专门指向那种返回类型为void的无参函数。

2、(*(void(*)())(0))(); 解析

`(*(void(*)())0) ()`  等同 `((void(*)())0) ()`
*硬件地址跳到0处:`(*(void(*)())0) ();`*
预习:
	`float (*h)();` 表示h是一个指向返回值float类型的函数的指针
	`(float(*)());` 表示一个"指向返回值float类型的函数的指针"的类型转换符
此处2解析转自:[参考1](https://blog.csdn.net/zyboy2000/article/details/4202349)[参考2](https://blog.csdn.net/adotcpp/article/details/8774905?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242)

3、code关键字

一般来说,C语言中定义每个变量初始化后都会占用一定内存(RAM)空间。在keil中提供了code关键字,这个关键字在C语言中没有。用法如下:
unsigned char code word[] = {
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
};
int code vel = 1201;

code作用就是将其修饰过的变量存储在ROM而非RAM中。RAM小,所以常量不变化的值一般可以使用code放入ROM中

4、ADC学习

Stm32f103有3个ADC精度为12位,每个ADC最多16个通道但是ADC12一般有16个;3只有8个。
送到可以单次连续扫描或间断进行。结果也可以选择对齐方式因为,16位数据寄存器。
转换顺序根据下图设置。
在这里插入图片描述

触发方式可以直接配置寄存器也可内部软件或者外部I/O触发。(通过CR寄存器进行设置)
转换时间(输入时钟、采样周期、转换时间)
输入时钟:因为挂在APB2所以PCLK2时钟72MHz,可以设置分频2/4/6/8一般为8即时钟频率为9MHz。
采样周期:配置采样周期可以确定使用多少个ADC时钟周期来对电压进行采样。采样周期数可以通过SMPR12中的SMP[2:0]设置。2控制通道09,1控制通道1017每个通道采样周期可以不同但是最少1.5个时间周期。
转换时间:采样时间+12.5个周期。12.5个周期是固定的,一般设置为PCLK2=72M,经过ADC预分频最大是12M这样算出采样周期1.5周期最短转换时间为1.17us。
中断:规则通道转换完成、注入通道转换完成、模拟看门狗事件。这些在SR寄存器中设置
Eg:转换后的数据为12位二进制数,测量电压范围是0~3.3 转换后的二进制数x,因为12位adc在转换时将电压的范围大小(3.3)转化为4096(2^12)份,所以转换后的二级制数x代表的真实典雅的计算方法就是y=3.3*x/4096

5、滴答定时器Systick

Systick(定时器系统嘀答定时器)24位的硬件定时器

Systick又叫系统嘀答定时器,是一个24位的硬件定时器。嵌入式操作系统常有一个类似“心跳”的定时器,来分配时间片,实现宏观上的多任务。其实,操作系统的多任务,在微观上,CPU对多任务的管理是分时的。每个任务都给一定的时间片,就是把时间分成N个等份,优先级高或是重要的任务多占几个时间片,优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统基于时间片的。
根据学过的物理中的时间与频率的公式:fosc=1/T T=1/fosc ,fosc为系统的频率。 如果STM32时钟频率为:72MHz,每次的时间为:T=1/72MHz。1秒钟为:1/(每次的时间)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。
反过来讲。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定时为1ms
转自:https://blog.csdn.net/qq_36373500/article/details/78703904

6、STM8复位(读取内存值方法)

在使用stm8l0时发现了一种复位方法叫非法操作码复位,原理是在内存中保存指定值(芯片手册中有写),当按下按键读取内存指定地址读到此值时复位。

typedef  void (*Function_Pointer)(void);
...
INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    Function_Pointer  Jump_Function;
  /* Jump to the illigal opcode address */
  Jump_Function = (Function_Pointer) 0x9F00;
  Jump_Function();
  EXTI_ClearITPendingBit(EXTI_IT_Pin1);
}

此处的Jump_Function = (Function_Pointer) 0x9F00;(Function_Pointer)我理解为强转功能,再将0x9F00这个函数指针赋值给Jump_Function再运行函数Jump_Function();即读取对应地址值。
typedef void (*fun)(void)

7、队列

队列讲解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值