定时器
按种类可分为高级、通用、基本定时器。
定时器的应用场景有定时计数,DAC/ADC时钟,PWM输出,输入捕获,输出比较,带可编程死区的互补输出。
串口DMA
CubeMX配置
代码部分
1.
2.
3.
整合
//串口接收
u8 uart_buf[20];
u8 rx_buf[10];
u8 rx_cnt;
u32 uartTick;
void RxIdle_Process()//串口接收延时判断函数
{
if(uwTick - uartTick < 50) return;//50ms清空一次
uartTick = uwTick;
rx_cnt = 0;
memset(rx_buf,'\0',sizeof(rx_buf));//清空缓存数组
}
/* 串口DMA不定长数据收发 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart == &huart1)
{
HAL_UART_Transmit_DMA(&huart1,uart_buf,Size);
rx_buf[rx_cnt++] = uart_buf[0];
if(rx_cnt > 0)
{
printf("%s",rx_buf);
}
/* 这里使用HAL_UARTEx)ReceiveToldle 或者 HAL_UARTEx_ReceiveToIdle_IT 也可以*/
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,uart_buf,sizeof(uart_buf));//启动接收
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);//关闭DMA传输过半中断
}
}
while(1)初始化前
//串口接收DMA
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,uart_buf,sizeof(uart_buf));
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);//关闭DMA传输过半中断
//这里填参数之前,要在main.h 里添加extern DMA_HandleTypeDef hdma_usart1_rx;
蓝牙模块
类型分为经典蓝牙(蓝牙耳机),低功耗蓝牙(运动手环等)。相当于透明的串口线
2.4Ghz国际通用公开的频段。
两种工作模式:AT指令模式,数据透传模式。
AT指令模式
AT指令模式指的是蓝牙未连接的工作模式。该模式下可以配置蓝牙参数(蓝牙名字,蓝牙密码,蓝牙地址......),需要利用固定的AT指令。不同公司设计的蓝牙模块的AT指令大同小异。
举例:
数据透传模式
数据透传模式指的是蓝牙已经被手机连接,该模式下蓝牙就相当于一根透明的串口线,蓝牙只负责把数据发送到目的地,不对数据进行处理。
命令处理过程中用到的函数
strstr()
strstr
函数用于在一个字符串中查找另一个子字符串,并返回子字符串第一次出现的位置。
函数原型
char *strstr(const char *haystack, const char *needle);
haystack
:要搜索的字符串。
needle
:要查找的子字符串。
返回值
如果 needle
是 haystack
的一个子字符串,返回 needle
在 haystack
中第一次出现的位置的指针。
如果 needle
为空字符串,返回 haystack
。
如果 needle
不在 haystack
中,返回 NULL
。
示例
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, world!";
const char *needle = "world";
char *result;
result = strstr(haystack, needle);
if (result != NULL) {
printf("Found '%s' at position: %ld\n", needle, result - haystack);
} else {
printf("'%s' not found\n", needle);
}
return 0;
}
strtok()
strtok
函数用于将一个字符串分割成多个标记(tokens),并根据指定的分隔符进行分割
函数原型
char *strtok(char *str, const char *delim);
str
:要分割的字符串。如果是第一次调用,传入要分割的字符串;之后的调用传入 NULL
。
delim
:分隔符字符串,由此字符串中的任意字符都将作为分隔符。
返回值
返回指向当前标记的指针。
当没有更多标记时,返回 NULL
。
示例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world! Welcome to C programming.";
const char *delim = " ,!";
char *token;
token = strtok(str, delim);
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}
return 0;
}