/******************************************************************************
* Copyright (C) 2021, Xiaohua Semiconductor Co., Ltd. All rights reserved.
*
* This software component is licensed by XHSC under BSD 3-Clause license
* (the "License"); You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************/
/******************************************************************************
* @file adt.c
*
* @brief Source file for Advanced Timer functions
*
* @author MADS Team
*
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "adt.h"
/**
******************************************************************************
** \addtogroup AdtGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
#define IS_VALID_ADT_STATE(x) ( AdtCMAF == (x)||\
AdtCMBF == (x)||\
AdtCMCF == (x)||\
AdtCMDF == (x)||\
AdtOVFF == (x)||\
AdtUDFF == (x)||\
AdtDTEF == (x)||\
AdtCMSAUF == (x)||\
AdtCMSADF == (x)||\
AdtCMSBUF == (x)||\
AdtCMSBDF == (x)||\
AdtCntDir == (x) )
#define ADTIM_HW_STASTPCLR_EN 31
#define ADTIM_HW_STASTPCLR_DIS 0x7FFFFFFF
#define ADTIM_SS_TIM4 1
#define ADTIM_SS_TIM5 2
#define ADTIM_SS_TIM6 4
#define ADTIM_PORT_BKE_NUM 15
/******************************************************************************
* Global variable definitions (declared in header file with 'extern') *
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/*****************************************************************
* \brief
* 配置中断
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
* \param [in] enAdtIrq 中断类型
* \param [in] bEn 中断使能/禁止
*
* \retval en_result_t Ok: 配置成功
*
****************************************************************/
en_result_t Adt_CfgIrq(M0P_ADTIM_TypeDef *ADTx,
en_adt_irq_type_t enAdtIrq,
boolean_t bEn)
{
uint32_t u32Val;
u32Val = ADTx->ICONR;
if (bEn)
{
u32Val |= 1u<<enAdtIrq;
}
else
{
u32Val &= ~(1u<<enAdtIrq);
}
ADTx->ICONR = u32Val;
return Ok;
}
/*******************************************************************
* \brief
* 获取中断标志
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
* \param [in] enAdtIrq 中断类型
*
*
* \retval TRUE/FALSE
*
*****************************************************************/
boolean_t Adt_GetIrqFlag(M0P_ADTIM_TypeDef *ADTx,
en_adt_irq_type_t enAdtIrq)
{
uint32_t u32Val;
boolean_t bEn;
ASSERT(IS_VALID_ADT_UNIT(enAdtUnit));
u32Val = ADTx->IFR;
bEn = (u32Val>>enAdtIrq) & 0x1;
return bEn;
}
/****************************************************************
* \brief
* 清除中断标志
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
* \param [in] enAdtIrq 中断类型
*
* \retval en_result_t Ok: 配置成功
*
****************************************************************/
en_result_t Adt_ClearIrqFlag(M0P_ADTIM_TypeDef *ADTx,
en_adt_irq_type_t enAdtIrq)
{
ADTx->ICLR = ~(1u<<enAdtIrq);
return Ok;
}
/****************************************************************
* \brief
* 清除所有中断标志
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
*
* \retval en_result_t Ok: 配置成功
*
****************************************************************/
en_result_t Adt_ClearAllIrqFlag(M0P_ADTIM_TypeDef *ADTx)
{
ADTx->ICLR = 0;
return Ok;
}
/**************************************************************
* \brief
* 配置硬件递加事件
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
* \param [in] enAdtHwCntUp 硬件递加事件
*
* \retval en_result_t Ok: 设置成功
*
****************************************************************/
en_result_t Adt_CfgHwCntUp(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_cnt_t enAdtHwCntUp)
{
uint32_t u32Val;
if (AdtHwCntMax <= enAdtHwCntUp)
{
return ErrorInvalidParameter;
}
u32Val = ADTx->HCUPR;
ADTx->HCUPR = u32Val | (1u<<enAdtHwCntUp);
return Ok;
}
/**************************************************************
* \brief
* 清除硬件递加事件
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
*
* \retval en_result_t Ok: 设置成功
*
************************************************************/
en_result_t Adt_ClearHwCntUp(M0P_ADTIM_TypeDef *ADTx)
{
ADTx->HCUPR = 0;
return Ok;
}
/**********************************************************
* \brief
* 配置硬件递减事件
*
* \param [in] ADTx ADV Timer通道选择(M0P_ADTIM4、M0P_ADTIM5、M0P_ADTIM6)
* \param [in] enAdtHwCntDwn 硬件递减事件
*
* \retval en_result_t Ok: 设置成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
***********************************************************/
en_result_t Adt_CfgHwCntDwn(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_cnt_t enAdtHwCntDwn)
{
uint32_t u32Val;
if(AdtHwCntMax <= enAdtHwCntDwn)
{
return ErrorInvalidParameter;
}
u32Val = ADTx->HCDOR;
ADTx->HCDOR = u32Val | (1u<<enAdtHwCntDwn);
return Ok;
}
/******************************************************************
* \brief
* 清除硬件递减事件
*
* \param [i
HC32L196串口中断发送数据
需积分: 0 12 浏览量
更新于2025-01-07
1
收藏 1.88MB ZIP 举报
HC32L196单片机是Holtek半导体公司推出的一款基于ARM-M0内核的32位高性能微控制器。它拥有强大的处理能力和丰富的外设资源,广泛应用于工业控制、智能家电、消费电子等领域。在使用HC32L196单片机进行项目开发时,串口通信是一项非常基础且重要的功能。串口通信以其简单、稳定、成本低廉等优点,成为微控制器与外部设备之间通信的首选方式。
在串口通信中,数据的发送和接收是非常关键的过程。传统的串口通信多采用查询方式,即程序不断查询串口状态寄存器,以判断是否可以进行数据的发送或接收。查询方式的优点是简单易懂,实现方便,但在数据量较大或者对实时性要求较高的应用场合中,查询方式可能会导致CPU资源的浪费,从而降低整个系统的效率。
为了提高串口通信的效率和实时性,中断方式成为了一种更好的选择。中断方式允许CPU在不进行串口查询的情况下,处理其他任务。当串口有数据发送或接收时,通过中断请求通知CPU,CPU响应中断后暂停当前任务,转而执行中断服务程序处理串口事件。这种方式可以有效利用CPU资源,提高系统处理多任务的能力。
在本例程中,开发者通过编写代码实现了使用HC32L196单片机的串口中断来发送数据。与查询方式相比,串口中断方式可以使得CPU在数据发送的等待时间里执行其他的任务,提高程序的执行效率和响应速度。开发者首先需要正确配置串口相关的寄存器,设置中断优先级以及使能中断,然后编写中断服务程序来处理数据发送的逻辑。当中断触发时,单片机会自动调用中断服务程序,根据程序设定,将数据通过串口发送出去。
使用中断方式发送数据的程序通常包括以下几个关键步骤:
1. 初始化串口模块,设置波特率、数据位、停止位以及校验位等参数。
2. 配置串口中断,包括中断优先级和中断使能。
3. 编写中断服务程序,设置发送标志或直接处理数据的发送。
4. 在主循环中,根据业务需求组织要发送的数据,并触发中断或等待中断服务程序处理。
整个过程中,用户需要充分理解HC32L196单片机的硬件手册,以及串口中断的相关知识,才能熟练地编写出高效、稳定的数据发送程序。
HC32L196单片机的串口中断发送数据方式能够有效提升通信效率和系统性能,尤其适用于数据量大、实时性要求高的应用场景。通过本例程的介绍,开发者可以掌握使用中断方式进行数据发送的基本方法和技巧,为更加复杂的应用开发打下坚实的基础。

小飞_天空
- 粉丝: 72
最新资源
- 信息化背景下企业财务管理对策分析(1).docx
- 自考电子商务网站设计原理复习资料(1).doc
- 大数据时代物流管理企业的机遇与挑战研究(1).docx
- 自动化系统分部电气设备分部工程监理实施细则(1).doc
- 【推荐】日常财务软件使用心得(1)(1).doc
- 苏宁易购电子商务模式分析案例分析(1).pptx
- 互联网时代现代农产品流通问题成因分析(1).docx
- 毕业设计(论文)-基于PLC的包装码垛机的控制系统设计(1).doc
- 互联网经济对高中生的影响及应对(1).docx
- 计算机科学技术在计算机教育中的应用(2)(1).docx
- 浅谈大数据信息技术在档案管理中的应用(1).docx
- 高职院校图书馆数据库建设的探索与思考(1).docx
- 初中计算机教学中激发听障学生学习兴趣的策略(1).docx
- 分析数字档案在档案信息化建设中的重要性(1).docx
- 初中生物信息化教学探究(1)(1).docx
- 2017年事业单位计算机考试真题及答案(1).doc