uint div3 = _dividend / 3;解释一下
时间: 2024-03-31 21:37:40 浏览: 83
这行代码将变量 _dividend 的值除以 3,并将结果赋给一个名为 div3 的无符号整数(unsigned integer)变量。因为 _dividend 和 div3 都是整数类型,所以这是一个整数除法。如果 _dividend 不能被 3 整除,那么 div3 变量将会保存下最接近 _dividend / 3 的整数。
相关问题
void pwm_init(PWMCH_enum pwmch, uint32 freq, uint32 duty, uint16_t TIM_OCPreload_Enable_Disable) { TIM_OCInitTypeDef TIM_OCInitStructure; uint16 match_temp; //占空比值 uint16 period_temp; //周期值 uint16 freq_div = 0; //分频值 pwm_gpio_init(pwmch); //PWM引脚初始化 /* 获取
该函数是一个用于STM32定时器PWM模式初始化的函数。具体实现步骤如下:
1. 定义一个TIM_OCInitTypeDef类型的结构体变量TIM_OCInitStructure,用于配置定时器的输出比较通道(Output Compare Channel)。
2. 定义两个变量match_temp和period_temp,分别用于存储PWM的占空比和周期值。
3. 定义一个变量freq_div,用于保存定时器的分频值。
4. 调用pwm_gpio_init函数,对PWM引脚进行初始化。
5. 根据输入参数pwmch,选择对应的定时器,并配置定时器的时钟源和分频值。
6. 根据输入参数freq,计算定时器的周期值和占空比的计数值。
7. 配置TIM_OCInitStructure结构体,设置PWM输出模式、占空比和预装载模式。
8. 启动定时器,并使能PWM输出。
以下是具体的代码实现:
```c
void pwm_init(PWMCH_enum pwmch, uint32 freq, uint32 duty, uint16_t TIM_OCPreload_Enable_Disable)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t match_temp;
uint16_t period_temp;
uint16_t freq_div = 0;
pwm_gpio_init(pwmch);
TIM_TypeDef *TIMx = pwmch_to_tim(pwmch);
if (TIMx == TIM1 || TIMx == TIM8) {
RCC_APB2PeriphClockCmd(pwmch_to_rcc(pwmch), ENABLE);
} else {
RCC_APB1PeriphClockCmd(pwmch_to_rcc(pwmch), ENABLE);
}
freq_div = (SystemCoreClock / 2) / freq;
period_temp = freq_div - 1;
match_temp = (period_temp + 1) * duty / 100 - 1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = period_temp;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = match_temp;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleness = TIM_OCIdleness_Reset;
TIM_OCInitStructure.TIM_OCNPIdleState = TIM_OCNPIdleState_Reset;
TIM_OCInitStructure.TIM_OCPreload = TIM_OCPreload_Enable_Disable;
TIM_OC1Init(TIMx, &TIM_OCInitStructure);
TIM_Cmd(TIMx, ENABLE);
TIM_CCxCmd(TIMx, pwmch_to_channel(pwmch), TIM_CCx_Enable);
}
```
在上述代码中,我们首先调用pwm_gpio_init函数,对PWM引脚进行初始化。然后根据输入参数pwmch,选择对应的定时器,并配置定时器的时钟源和分频值。接着,根据输入参数freq,计算定时器的周期值和占空比的计数值,并配置TIM_OCInitStructure结构体,设置PWM输出模式、占空比和预装载模式。最后启动定时器,并使能PWM输出。
完善以下代码 char display_buf[MAX_LINE][LINE_LEN + 1] = {0}; // 显示缓存 char BackStor_buf[MAX_Back_LINE][LINE_Back_LEN + 1]; // 备份缓存 uint8_t current_line = 0; // 当前行数 uint8_t current_pos = 0; // 当前字符数 uint8_t fact_line = 0; // 当前真实行数,即已经添加到缓存中的行数 uint8_t Page_logo = 0; // 当前页面 uint8_t Page_line = 0; // 备份行数 uint8_t MAX_Page; // 向显示缓存中添加一行文本 void add_display_line(char* text) { strcpy(BackStor_buf[fact_line], text); if (current_line == MAX_LINE) { // 如果缓存已满,则将所有行上移一行 ; for (int i = 1; i < MAX_LINE; i++) { strcpy(display_buf[i - 1], display_buf[i]); } if ((fact_line / current_line) != 0) { Page_logo = fact_line / current_line; MAX_Page=Page_logo; } if(Page_line==current_line) Page_line=0; current_line--; } // 将新行添加到缓存末尾 strcpy(display_buf[current_line], text); current_line++; fact_line++; Page_line++; }
完善后的代码如下:
```
#define MAX_LINE 10 // 显示缓存最大行数
#define LINE_LEN 80 // 每行最大字符数
#define MAX_Back_LINE 20 // 备份缓存最大行数
#define LINE_Back_LEN 80 // 每行最大字符数
char display_buf[MAX_LINE][LINE_LEN + 1] = {0}; // 显示缓存
char BackStor_buf[MAX_Back_LINE][LINE_Back_LEN + 1]; // 备份缓存
uint8_t current_line = 0; // 当前行数
uint8_t current_pos = 0; // 当前字符数
uint8_t fact_line = 0; // 当前真实行数,即已经添加到缓存中的行数
uint8_t Page_logo = 0; // 当前页面
uint8_t Page_line = 0; // 备份行数
uint8_t MAX_Page = 0; // 最大页数
// 向显示缓存中添加一行文本
void add_display_line(char* text) {
// 将新行添加到缓存末尾
strcpy(BackStor_buf[fact_line], text);
strcpy(display_buf[current_line], text);
// 如果缓存已满,则将所有行上移一行
if (current_line == MAX_LINE) {
for (int i = 1; i < MAX_LINE; i++) {
strcpy(display_buf[i - 1], display_buf[i]);
}
current_line--;
Page_line--;
// 如果当前页已满,则翻页,并更新最大页数
if (Page_line == 0) {
Page_logo++;
MAX_Page = fact_line / current_line;
if (Page_logo > MAX_Page) {
Page_logo = MAX_Page;
}
}
}
current_line++;
fact_line++;
Page_line++;
}
```
在修改后的代码中,我们增加了一些宏定义,定义了缓存的最大行数和字符数,以及备份缓存的最大行数和字符数。同时,我们还添加了一个最大页数的变量 `MAX_Page`。在 `add_display_line` 函数中,我们首先将新行添加到缓存末尾,然后再判断当前缓存是否已满,如果已满,则将所有行上移一行。在上移行的过程中,需要将当前行和页码减一。如果当前页已满,则翻页,并更新最大页数。最后,我们将当前行、实际行和页码均加一。