速成记录-蓝桥杯嵌入式

深夜一小时速成。

出BUG了一定不要着急,从初始化配置开始检查,仔细Debug

串口字符串处理

复制字符串

// 从存储区 str2 复制 n 个字节到存储区 str1
void *memcpy(void *str1, const void *str2, size_t n)
// 
void *memmove(void *str1, const void *str2, size_t n) 
char *strcpy(char *dest, const char *src)
// 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
char *strncpy(char *dest, const char *src, size_t n)

字符串拼接

char *strcat(char *dest, const char *src)
char *strncat(char *dest, const char *src, size_t n)

清空字符串/缓冲区

// 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
void *memset(void *str, int c, size_t n)

字符串比较

// 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
int strcmp(const char *str1, const char *str2)

字符串分解

// 分解字符串 str 为一组字符串,delim 为分隔符。
char *strtok(char *str, const char *delim)
// 从字符串读取格式化输入。   
int sscanf(const char *str, const char *format, ...)

提取子串


// 裁剪字符串
void Cut_String(uint8_t * destination_str,uint8_t * source_str,uint8_t location,uint8_t length)
{
    for(int i = 0; i < length; i++)
    {
        destination_str[i] = source_str[location + i];
    }
    destination_str[length] = '\0';
}

// 字符串逻辑检查 0:没问题 1:逻辑问题 2:接收问题 
uint8_t Rx_Check(uint8_t * str)
{
    
}

串口

串口DMA发送一批数据

HAL_UART_Transmit_DMA(&huart1,Tx_Buff,strlen((char *)Tx_Buff));

串口IDLE+DMA接收

// 使能串口IDLE中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
// 串口DMA接收一批数据
HAL_UART_Receive_DMA(&huart1, Rx_Buff, 255);

/**
  * @brief This function handles DMA1 channel5 global interrupt.
  */
void DMA1_Channel5_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */

  /* USER CODE END DMA1_Channel5_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_usart1_rx);
  /* USER CODE BEGIN DMA1_Channel5_IRQn 1 */

  /* USER CODE END DMA1_Channel5_IRQn 1 */
}

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    // 获取中断标志
	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!= RESET) 
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1); //  清除标志位
        HAL_UART_DMAStop(&huart1); 			//  停止DMA传输,防止
        Data_length=255-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx); // 接收长度
        recv_end_flag = 1;	// 接受完成标志位置1
    }
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

PWM 输出

// 定时器PWM信号输出
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
// 设置周期
__HAL_TIM_SET_AUTORELOAD(&htim3,2000-1);
// 设置通道比较值
__HAL_TIM_SET_COMPARE(&htim3,1000);

PWM 输入捕获

float Period_2;
float D_period_2;
float freq_2;
float duty_2;

// 开启定时器捕获中断模式
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);

// 输入捕获中断服务函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
    {
        if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
        {
            Period_1=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
            D_period_1=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
            freq_1=1000000/Period_1;
            // 必须加float
            duty_1=D_period_1/Period_1 * 100;
        }
    }
    
    if(htim->Instance==TIM3)
    {
        if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
        {
            Period_2=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
            D_period_2=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
            freq_2=1000000/Period_2;
            // 必须加float
            duty_2=D_period_2/Period_2 * 100;
        }
    }
}

ADC

uint16_t Get_ADC1(void)
{
    uint16_t temp;
    HAL_ADC_Start(&hadc1);
    temp=HAL_ADC_GetValue(&hadc1);
    return temp;
}

DAC

void DAC_Out(float Out_value)
{
    uint32_t temp;
    temp=4096*Out_value/3.3f;
    HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp);
    HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
}

eeprom

void eeprom_write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char Size)
{
    I2CStart();
    I2CSendByte(0xa0); // д��ַ
    I2CWaitAck();
  
    I2CSendByte(ucAddr); //
    I2CWaitAck();
  
    while(Size--)
    {
          I2CSendByte(*pucBuf++); // ???+??
          I2CWaitAck();
    }

    I2CStop();
    delay1(500);
}

void eeprom_read(unsigned char *pucBuf, unsigned char ucAddr, unsigned char Size)
{
    I2CStart();
    I2CSendByte(0xa0); // ����ַ
    I2CWaitAck();
  
    I2CSendByte(ucAddr); //
    I2CWaitAck();
  
    I2CStart();
    I2CSendByte(0xa1); // ����ַ
    I2CWaitAck();
    while(Size--)
    {
        *pucBuf=I2CReceiveByte(); // ???+??
        pucBuf++;
        if(Size)
          I2CSendAck();
        else
          I2CSendNotAck();
    }
    I2CStop();
}

mcp4017

void mcp4017_write(uint8_t  res_val)
{
    I2CStart();
    I2CSendByte(0x5E);
    I2CWaitAck();

    I2CSendByte(res_val); //
    I2CWaitAck();
    I2CStop();
}


uint8_t  mcp4017_read(void)
{
    uint8_t res_N;
    I2CStart();
    I2CSendByte(0x5f);
    I2CWaitAck();

    res_N=I2CReceiveByte(); //
    I2CSendNotAck();
    I2CStop();

    return res_N;
}

RTC

//RTC相关变量
RTC_TimeTypeDef H_M_S_Time;
RTC_DateTypeDef Y_M_D_Date;
uint8_t Second;

//函数调用
HAL_RTC_GetTime(&hrtc, &H_M_S_Time, RTC_FORMAT_BIN);//读取日期和时间必须同时使用
HAL_RTC_GetDate(&hrtc, &Y_M_D_Date, RTC_FORMAT_BIN);

LCD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值