stm32笔记

数码管:

void displayNumber(uint8_t aa,uint8_t num) {
    // 数码管的显示模式
	uint8_t displayMode[10][8] = {
	    {0, 0, 0, 0, 0, 0, 1, 1}, // 0
	    {1, 0, 0, 1, 1, 1, 1, 1}, // 1
	    {0, 0, 1, 0, 0, 1, 0, 1}, // 2
	    {0, 0, 0, 0, 1, 1, 0, 1}, // 3
	    {1, 0, 0, 1, 1, 0, 0, 1}, // 4
	    {0, 1, 0, 0, 1, 0, 0, 1}, // 5
	    {0, 1, 0, 0, 0, 0, 0, 1}, // 6
	    {0, 0, 0, 1, 1, 1, 1, 1}, // 7
	    {0, 0, 0, 0, 0, 0, 0, 1}, // 8
	    {0, 0, 0, 0, 1, 0, 0, 1}  // 9
	};

    //   afedcg
    // 设置数码管的引脚状态
    HAL_GPIO_WritePin(LED_A_GPIO_Port, LED_A_Pin, (GPIO_PinState)displayMode[num][0]);
    HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, (GPIO_PinState)displayMode[num][1]);
    HAL_GPIO_WritePin(LED_C_GPIO_Port, LED_C_Pin, (GPIO_PinState)displayMode[num][2]);
    HAL_GPIO_WritePin(LED_D_GPIO_Port, LED_D_Pin, (GPIO_PinState)displayMode[num][3]);
    HAL_GPIO_WritePin(LED_E_GPIO_Port, LED_E_Pin, (GPIO_PinState)displayMode[num][4]);
    HAL_GPIO_WritePin(LED_F_GPIO_Port, LED_F_Pin, (GPIO_PinState)displayMode[num][5]);
    HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, (GPIO_PinState)displayMode[num][6]);
    HAL_GPIO_WritePin(LED_DP_GPIO_Port, LED_DP_Pin, (GPIO_PinState)displayMode[num][7]);

    if(aa==1){
    	HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_SET); // 将 LED_1 引脚电平置高
    	HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_RESET); // 将 LED_2 引脚电平置低
    	HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_RESET); // 将 LED_3 引脚电平置低
    	HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_RESET); // 将 LED_4 引脚电平置低
    }
    else if(aa==2){
    	HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET); // 将 LED_1 引脚电平置高
    	HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_SET); // 将 LED_2 引脚电平置低
    	HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_RESET); // 将 LED_3 引脚电平置低
    	HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_RESET); // 将 LED_4 引脚电平置低
    }
    else if(aa==3){
    	HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET); // 将 LED_1 引脚电平置高
    	HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_RESET); // 将 LED_2 引脚电平置低
    	HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_SET); // 将 LED_3 引脚电平置低
    	HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_RESET); // 将 LED_4 引脚电平置低
    }
    else if(aa==4){
    	HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET); // 将 LED_1 引脚电平置高
    	HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_RESET); // 将 LED_2 引脚电平置低
    	HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_RESET); // 将 LED_3 引脚电平置低
    	HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_SET); // 将 LED_4 引脚电平置低
    }
}
uint32_t seconds = 0;
uint8_t displayPosition = 1; // 初始化显示位置为第一位

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM3) { // 假设你使用的是 TIM3 定时器
        seconds++; // 秒数加一
        if (seconds >= 6000) { // 如果超过了一小时,重置秒数
            seconds = 0;
        }



    }
}

void displayNumber00(uint32_t num) {
    uint8_t digits[4] = {0}; // 存储每个位上的数字

    // 分离每个位上的数字
    for (int i = 3; i >= 0; i--) {
        digits[i] = num % 10; // 取出最后一位数字
        num /= 10; // 去掉最后一位数字
    }

    // 显示每个位上的数字
    for (int i = 0; i < 4; i++) {
        // 如果没有数字,则显示0
        uint8_t digit = (i < 4) ? digits[i] : 0;
        // 调用 displayNumber 函数显示数字
        displayNumber(i + 1, digit);
        // 延时一段时间,可以根据需要调整
        HAL_Delay(2);
    }
}

定时器:

普通定时(中断):

1.

3  启动定时器

  HAL_TIM_Base_Start_IT(&htim3);

4 回调函数


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM3) {
            //执行
        }
}

编码器模式:

1

2

HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);

不需要回调函数

串口:

接线注意TX-RX RX-TX

1

2

基本函数

    // 发送数据到串口
    char data[] = "Hello, world!\r\n";
    HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), HAL_MAX_DELAY);
// 发送数据到串口1,使用DMA模式
char data[] = "Yes\r\n";
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)data, strlen(data));

回调函数(发送or接收之后执行操作用)

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  // 当串口 DMA 发送完成时,此回调函数被调用
  if (huart->Instance == USART1)
  {
    // 这里可以添加你想要执行的操作
  }
}



接受再发送回调函数(记得开中断)
主函数:		HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));



void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
	if(huart == &huart2) {
		HAL_UART_Transmit_IT(&huart2, receiveData, Size);

		HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));
	}
}

OLED:

初始化

开启IIC的IIC模式

开启快速模式

复制oled.c font.c 复制oled.h font.h

OLED_NewFrame();
//显示函数
OLED_ShowFrame();

显示函数

颜色参数:OLED_COLOR_NORMAL
OLED_COLOR_REVERSED


OLED_DrawCircle();等
OLED_Draw.....系列
画图形

显示本地图片

串口助手生成代码

复制到font.c末尾

在font.h中导出

最后

OLED_DrawImage(43,0,&aaaImg,OLED_COLOR_NORMAL);

显示汉字

在串口助手取模之后到font..c取代相同大小的数组,到font.h返回一下

最后直接在双引号直接写汉字和ASCLL的字符

OLED_PrintString(0,0,"这里写汉字",&font16x16,OLED_COLOR_NORMAL);

蓝牙模块

串口设置异步发送

蓝牙波特率默认9600

初始化代码

主函数接收数据
uint8_t receiveData[50];
HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));

回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
	if(huart == &huart2) {
		HAL_UART_Transmit_IT(&huart2, receiveData, Size);

		HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));
	}
}



当前示例为发送什么再接什么

波特律动 串口助手 (keysking.com) 或手机app(搜索SPP然后连接)

超声波测距

旋转编码器

开启一个定时器的“编码器模式”   然后把旋转编码器AB分布i连接到:

开启定时器
	  HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);


初始化数据
    	    htim3.Instance->CNT = 1000;



主函数循环

	        char send_buf[50] = {0};
	          uint16_t cnt_encoder = 0;
	        if (cnt_encoder != __HAL_TIM_GET_COUNTER(&htim3))
	            {
	              OLED_NewFrame();
	              cnt_encoder = __HAL_TIM_GET_COUNTER(&htim3);
	              sprintf(send_buf, "%d\n", cnt_encoder);
	               OLED_PrintString(0,0,send_buf,&font16x16,OLED_COLOR_NORMAL);
	              HAL_UART_Transmit(&huart1, (uint8_t *)send_buf, strlen(send_buf), 10);
	              HAL_UART_Transmit(&huart2, (uint8_t *)send_buf, strlen(send_buf), 10);
	               OLED_ShowFrame();
	            }
	            HAL_Delay(10);

光敏电阻传感器

开启ADC

连接光敏电阻DO到

主函数循环
	            HAL_ADC_Start(&hadc1);
	            uint16_t a = HAL_ADC_GetValue(&hadc1);
	            OLED_NewFrame();
	            char aa[10];
	            sprintf(aa, "%d\n", a);
	            OLED_PrintString(0,0,aa,&font16x16,OLED_COLOR_NORMAL);
	            HAL_UART_Transmit(&huart1, (uint8_t *)aa, strlen(aa), 10);
	            HAL_UART_Transmit(&huart2, (uint8_t *)aa, strlen(aa), 10);
	            OLED_ShowFrame();

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值