先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
正文
```
+ 使用寄存器直接修改比较值
```
htim2.Instance->CCR2 = pulseVal;
```
+ 不难发现通过修改重装载值也可以调整输出信号的占空比,但是由于重装载值会对频率和占空比同步产生影响,所以在使用时根据要求需要仔细计算。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/42232794ff2c485ba21a4ee0f71132a8.bmp)
3、串口通信
-
串口收发函数
- 阻塞式发送函数:不发完芯片不继续运行
HAL\_StatusTypeDef HAL\_UART\_Transmit(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size, uint32_t Timeout); /\* 阻塞式发送函数,发送未完成时函数阻塞 \*/ /\* huart 参数: 实例,句柄,如 &huart1 pData 参数: 存放要发送的数据的指针 Size 参数: 存放要发送的数据的长度 Timeout 参数:超时时间,超过此长度仍未发送成功则阻塞完毕,停止发送,函数执行完毕 \*/
- 非阻塞式发送函数:芯片正常运行,串口发完会引发中断之后进入中断回调函数。
HAL\_StatusTypeDef HAL\_UART\_Transmit\_IT(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size); /\* 非阻塞式发送函数,发送一半时或完毕后响应发送中断 \*/ /\*huart 参数: 实例,句柄如 &huart1 pData 参数: 存放要发送的数据的指针 Size 参数: 存放要发送的数据的长度 \*/ __weak void HAL\_UART\_TxCpltCallback(UART\_HandleTypeDef \*huart); /\* 发送完毕中断回调函数 \*/ __weak void HAL\_UART\_TxHalfCpltCallback(UART\_HandleTypeDef \*huart); /\* 发送一半中断回调函数 \*/
- 阻塞式接收函数
HAL\_StatusTypeDef HAL\_UART\_Receive(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size, uint32_t Timeout);
- 非阻塞式接收函数
HAL\_StatusTypeDef HAL\_UART\_Receive\_IT(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size); __weak void HAL\_UART\_RxCpltCallback(UART\_HandleTypeDef \*huart); /\* 接收完毕中断回调函数 \*/ __weak void HAL\_UART\_RxHalfCpltCallback(UART\_HandleTypeDef \*huart); /\* 接收一半中断回调函数 \*/
-
串口获取输入信息:通过sscanf获取串口输入的信息并进行储存,获取完成后需要将缓冲数组和数组指针清零以便下一次接收。
sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);
//清零
rx_pointer=0;
memset(rxdata,0,30);
- 串口输出指定信息
char temp[20];
sprintf(temp,"Error");
HAL\_UART\_Transmit(&huart1,(uint8_t\*)temp,strlen(temp),50);
char temp[20];
sprintf(temp,"%cNBR:%c%c%c%c:%ld:%.2f",&car_data[i].Car_Type,car_data[i].Car_Num[0],car_data[i].Car_Num[1],car_data[i].Car_Num[2],car_data[i].Car_Num[3],H,money);
HAL\_UART\_Transmit(&huart1,(uint8_t\*)temp,strlen(temp),50);
- 重定向输出:串口也可以使用
printf()
函数进行重定向从而输出,但不知道为什么使用printf函数时,LCD屏无法初始化也无法启用,现在还没有找到原因。
//重定向printf函数为串口输出
int fputc(int ch,FILE \*p){
char c = ch;
HAL\_UART\_Transmit(&huart1,(unsigned char \*)&c, 1, 50);
return ch;
}
4、日期时间转换与时间计算
- 将输入信息转换为年月日
//计算年月日时分秒
Year = 2000 + (rxdata[10] - 0x30) \* 10 + (rxdata[11] - 0x30);
Mon = (rxdata[12] - 0x30) \* 10 + (rxdata[13] - 0x30);
Day = (rxdata[14] - 0x30) \* 10 + (rxdata[15] - 0x30);
Hour = (rxdata[16] - 0x30) \* 10 + (rxdata[17] - 0x30);
Min = (rxdata[18] - 0x30) \* 10 + (rxdata[19] - 0x30);
Sec = (rxdata[20] - 0x30) \* 10 + (rxdata[21] - 0x30);
-
使用
sscanf
获取年月日信息:其中sscanf(input, "%[^:]:%*[^:]:%s", info, datetime);
为格式化字符串,用于指定 sscanf 如何解析 rxdata 中的数据:%[^:]
:匹配非冒号字符的任意序列,因此它会匹配信息字段,info 是用来存储这个字段的数组。:%*[^:]
:匹配一个冒号后面紧跟着的任意字符序列,但是由于 %* 的存在,这个部分的匹配结果会被忽略,所以它会跳过信息字段后的冒号和其后的字符。%s
: 匹配任意非空白字符序列,因此它会匹配日期时间字段,datetime 是用来存储这个字段的数组。
char info[10], datetime[14];
sscanf(input, "%[^:]:%\*[^:]:%s", info, datetime);
//计算年月日时分秒
sscanf(datetime, "%.2d%.2d%.2d%.2d%.2d%.2d", &Year, &Mon, &Day, &Hour, &Min, &Sec);
Year+=2000;
- Unix时间与格林尼治时间相互转换
mktime()
:将时间转换为自1970年1月1日以来逝去时间的秒数,发生错误时返回-1。也就是是把获取的时间转换成时间戳。
gmtime()
:返回tm结构的格林尼治时间(GMT)。
// 将tm结构体转换为Unix时间戳
time_t unix_time = mktime(&tm_info);
// 将Unix时间戳转换为标准时间格式
struct tm \*standard_time = gmtime(&unix_time);
// 输出转换后的标准时间格式和信息
printf("标准时间格式:%.4d-%.2d-%.2d %.2d:%.2d:%.2d\n",
standard_time->tm_year + 1900, standard_time->tm_mon + 1,
standard_time->tm_mday, standard_time->tm_hour,
standard_time->tm_min, standard_time->tm_sec);
- 计算时间间隔时可以将年月日转换为Unix时间便于计算
struct tm tm_info;
//视为出场,计算出场时间
tm_info.tm_year = Year - 1900;
tm_info.tm_mon = Mon - 1;
tm_info.tm_mday = Day;
tm_info.tm_hour = Hour;
tm_info.tm_min = Min;
tm_info.tm_sec = Sec;
tm_info.tm_isdst = -1; //夏令时
car_out = mktime(&tm_info); //将年月日时间转换成Unix时间,便于计算
if(car_out==-1) {
char temp[20];
sprintf(temp,"Error7");HAL\_UART\_Transmit(&huart1,(uint8_t\*)temp,strlen(temp),50);
goto Error;
}
//计算本次出场车辆的入场时间
tm_info.tm_year = car_data[i].Year - 1900;
tm_info.tm_mon = car_data[i].Mon - 1;
tm_info.tm_mday = car_data[i].Day;
tm_info.tm_hour = car_data[i].Hour;
tm_info.tm_min = car_data[i].Min;
tm_info.tm_sec = car_data[i].Sec;
tm_info.tm_isdst = -1; //夏令时
//将入场年月日时间转换成Unix时间,便于计算
car_in = mktime(&tm_info);
//出场时间减去入场时间,结果为车辆在停车场的时间(单位为秒)
input_time=car_out - car_in;
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/eac6f5d357e440e012dd28d000b5b99c.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/2b1116cf23954d95ec8283c8c0320e75.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
![img](https://img-blog.csdnimg.cn/img_convert/2c85cf1223960e108f9ba56df026328e.jpeg)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
[外链图片转存中...(img-Tr5uM5PY-1713472053826)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**