(M052)利用PWM波实现LED灯亮度调节

2023-05-16

#include <stdio.h>
#include <stdint.h>
#include "M051.h"
#include "Register_Bit.h"
#include "Common.h"
#include "UART.h"
#include "Retarget.h"
#include "Macro_SystemClock.h"


#define RXBUFSIZE             64
#define TXBUFSIZE             64

#define TRUE                  1
#define FALSE                 0

/* ----------------------------------------------------------------------------------
    Global variables
  ----------------------------------------------------------------------------------*/                                                                               
uint32_t HighCounter = 0;
uint32_t LowCounter  = 0;
uint32_t LowFlag = FALSE;
uint32_t BrightNess[10] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10};
uint32_t BrightLevel    = 0;
uint32_t PWMTime = 0;
uint32_t PWMTimeOut  = 0;
uint32_t PWMCount = 0;
uint8_t  comRbuf[RXBUFSIZE];               //recieve buffer
uint8_t  comTbuf[TXBUFSIZE];               //send buffer
uint8_t  comRbyte = 0;
uint8_t  comRtail = 0;

void SendUARTChar( uint8_t c )
{
   /* check Tx Empty */
    UA1_THR = ( uint8_t )c;
    while( (UA1_FSR & TX_EMPTY) != 0x00 );
}

void SendString( uint8_t *pbString , uint32_t length )
{
    uint32_t j = 0;
    /* send string to UART1    */
    for( j = 0 ; j < length ; j++ )
    {
            SendUARTChar( *( pbString+j ));
    }
}

/*-----------------------------------------------------------------------------
  Function:        UART_Init                                                                         
                                                                                                         
  Parameter:                                                                                                   
                None                                     
  Returns:                                                                                                
                   None                                                                                      
  Description:                                                                                            
                   Initialize UART1, 9600bps, 8N1.                                    
 *-----------------------------------------------------------------------------*/
void UART1_Init( )
{
    /* Step 1. GPIO initial */
    P1_MFP &= ~( ((1<<11)|(1<<3)) | ((1<<10)|(1<<2)) );   
    P1_MFP |= (1<<11) | (1<<10);            //P1.2 --> UART1 RX
                                            //P1.3 --> UART1 TX
    /* Step 2. Enable and Select UART clock source*/
    UART1_Clock_EN;           //UART Clock Enable, APBCLK[16]:1
    UARTClkSource_ex12MHZ;    //UART Clock is ext12MHz, CLKSEL1[25,24]: 00
    CLKDIV &= ~(15<<8);       //UART Clock DIV Number = 0;

    /* Step 3. Select Operation mode */
    IPRSTC2 |= UART1_RST;     //Reset UART1
    IPRSTC2 &= ~UART1_RST;    //Reset end
    UA1_FCR |= TX_RST;        //Tx FIFO Reset
    UA1_FCR |= RX_RST;        //Rx FIFO Reset

    UA1_LCR &= ~PBE;           //Parity Bit Disable
    UA1_LCR &= ~WLS;
    UA1_LCR |= WL_8BIT;       //8 bits Data Length
    UA1_LCR &= NSB_ONE;       //1 stop bit

    /* Step 4. Set BaudRate */
    UA1_BAUD |= DIV_X_EN;     //Mode2:DIV_X_EN = 1
    UA1_BAUD |= DIV_X_ONE;    //Mode2:DIV_X_ONE =1
    
    /* For XTAL = 12 MHz */
    UA1_BAUD |= ((12000000 / 9600 ) -2);    //Set BaudRate to 115200;  UART_CLK/(A+2) = 115200, UART_CLK=12MHz
}



void TMR0_Init(void)
{
    /* Enable Timer0 clock source */
    APBCLK |= TMR0_CLKEN;
    /* Select Timer0 clock source as external 12M */  
    CLKSEL1 = (CLKSEL1 & (~TM0_CLK)) | TM0_12M;         

    /* Reset IP TMR0 */
    IPRSTC2 |= TMR0_RST;
    IPRSTC2 &= ~TMR0_RST;  

    /* Select timer0 Operation mode as period mode */    
    TCSR0 &= ~TMR_MODE;
    TCSR0 |= MODE_PERIOD;            

    /* Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
    TCSR0  = TCSR0 & 0xFFFFFF00;        // Set Prescale [0~255]
    TCMPR0 = 12000;                    // Set TCMPR  

    /* Enable timer0 interrupt */
    TCSR0 |= TMR_IE;        
    NVIC_ISER |= TMR0_INT;    

    /* Reset timer0 counter */
    TCSR0 |= CRST;    

    /* Enable Timer0 */                    
    TCSR0 |= CEN;                        
}

/*-----------------------------------------------------------------------------
  Function:        TMR0_IRQHandler                                                                         
                                                                                                         
  Parameter:                                                                                                   
                None                                    
  Returns:                                                                                                
                   None                                                                                      
  Description:                                                                                            
                   Timer0 ISR routine                                    
 *-----------------------------------------------------------------------------*/
void TMR0_IRQHandler(void)
{
    /* Clear timer0 interrupt flag */
    TISR0 |= TMR_TIF;
    if( HighCounter != BrightNess[BrightLevel] && LowFlag == FALSE )
    {
        P21_DOUT |= 0x01;
        HighCounter++;
    }
    else
    {
        LowFlag = TRUE;
        if( LowCounter != 10 - BrightNess[BrightLevel] )
        {
            P21_DOUT &= 0x00;
            LowCounter++;
        }
        else
        {
            HighCounter = 0;
            LowCounter  = 0;
            P21_DOUT |= 0x01;
            LowFlag = FALSE;
        }    
    }
}

void GPIOP2P3P4_IRQHandler( void )
{
    P4_ISRC &= 0x02;
    HighCounter = 0;
    LowCounter  = 0;
    LowFlag = FALSE ;
    BrightLevel = ( BrightLevel == 9 )? 0 : (BrightLevel+1);
}

 void UART1_IRQHandler(void)
{
     uint8_t bInChar[1]={0xFF};
    
    if(UA1_ISR & RDA_INT)
    {    
        /* Get all the input characters */
        while(UA1_ISR & RDA_IF)
        {
            /* Check RX empty */
            while (UA1_FSR & RX_EMPTY);
            bInChar[0] = UA1_RBR;                      
            /* Check if buffer full */
            if(comRbyte < RXBUFSIZE)
            {
                /* Enqueue the character */
                comRbuf[comRtail] = bInChar[0];
                comRtail = (comRtail == (RXBUFSIZE-1)) ? 0 : (comRtail+1);
                comRbyte++;
            }            
        }
    }
}


void  main()
{
    /* UART Clock is ext12MHz */
    uint32_t i = 0;
//    UARTClkSource_ex12MHZ;                
    Un_Lock_Reg();    
//    ClkRegUnlock;
    /* Enable external 12M Crystal */
    PWRCON |= XTL12M_EN;
    /* Wait until 12M clock is stable. */
    while((CLKSTATUS & XTL12M_STB) == 0);     
    /* Set external 12M crystal as the system clock    */
    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
    /* Set pin mode as output */
    P3_PMD &= Px1_OUT;
    P2_PMD &= Px1_OUT;

    TMR0_Init();
    /* Set P4.1 as interrpt pin */
    P4_PMD |= 0xffff;
    P4_PMD &=  Px1_IN;
    P4_IEN |=  IF_EN1;    
    P4_IMD &=  IMD1_EDG;
    DBNCECON  &= 0x00;
    DBNCECON  |= 0x33;                                  
    P4_DBEN   &= 0x00;
    P4_DBEN   |= DBEN1;                            //Enable P4.1 De-bounce function.            
    NVIC_ISER |= GP234_INT;                        //Enable p2p3p4 interrupt

    UART1_Init();
    UA1_IER    |= RDA_IEN    ;
    NVIC_ISER |= UART1_INT;
    while(1)
    {
//        SendString( comRbuf , 64 );    
    }
}    


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(M052)利用PWM波实现LED灯亮度调节 的相关文章

  • 40 个 SpringBoot 常用注解:让生产力爆表!

    64 RequestMapping 64 RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射 Spring MVC和Spring WebFlux都通过RquestMappingHandlerMapping和
  • 分页 + 模糊查询 有坑!

    前言 不知道你有没有使用过Mysql的like语句 xff0c 进行模糊查询 xff1f 不知道你有没有将查询结果 xff0c 进行分页处理 xff1f 模糊查询 xff0c 加上分页处理 xff0c 会有意想不到的坑 xff0c 不信我们
  • Spring Boot + Netty + WebSocket 实现消息推送

    关于Netty Netty 是一个利用 Java 的高级网络的能力 xff0c 隐藏其背后的复杂性而提供一个易于使用的 API 的客户端 服务器框架 Maven依赖 lt dependencies gt lt https mvnreposi
  • isEmpty 和 isBlank 的用法区别

    也许你两个都不知道 也许你除了isEmpty isNotEmpty isNotBlank isBlank外 并不知道还有isAnyEmpty isNoneEmpty isAnyBlank isNoneBlank的存在 come on 让我们
  • 300万数据导入导出优化方案,从80s优化到8s

    前景 在项目开发中往往需要使用到数据的导入和导出 xff0c 导入就是从Excel中导入到DB中 而导出就是从DB中查询数据然后使用POI写到Excel上 写本文的背景是因为在工作中遇到了大数据的导入和导出 xff0c 问题既然来了逃跑不如
  • 快速定位 SpringBoot 接口超时问题的神器

    背景 公司有个渠道系统 xff0c 专门对接三方渠道使用 xff0c 没有什么业务逻辑 xff0c 主要是转换报文和参数校验之类的工作 xff0c 起着一个承上启下的作用 最近在优化接口的响应时间 xff0c 优化了代码之后 xff0c 但
  • 常用开源监控系统分析推荐

    摘要 xff1a 在互联网信息爆炸式快速发展的今天 xff0c 各类复杂多样的平台系统相继涌出 如何选择最佳的监控产品以更好地维护这些平台和系统是每个 IT 人员都需面临的难题 本文将从开源监控产品的起源和发展 xff0c 详细解析各个时代
  • 一个非常实用的分布式 JVM 监控工具

    介绍 该项目为了方便开发者更快监控多个远程主机jvm xff0c 如果你的项目是Spring boot那么很方便集成 xff0c jar包引入即可 xff0c 不是Spring boot也不用气馁 xff0c 你可以快速自行初始化一个Spi
  • 【Java】HttpRequest 获得请求的url进行判断

    一 span class token class name HttpRequest span 获得请求的url进行判断 request span class token punctuation span span class token f
  • 秒杀系统的思考

    极限并发带来的思考 虽然现在大多数情况下都能订到票 xff0c 但是放票瞬间即无票的场景 xff0c 相信大家都深有体会 尤其是春节期间 xff0c 大家不仅使用 12306 xff0c 还会考虑 智行 和其他的抢票软件 xff0c 全国上
  • 为什么禁止MyBatis批量插入几千条数据使用foreach?

    近日 xff0c 项目中有一个耗时较长的Job存在CPU占用过高的问题 xff0c 经排查发现 xff0c 主要时间消耗在往MyBatis中批量插入数据 mapper configuration是用foreach循环做的 xff0c 差不多
  • SpringBoot 那些天生自带 Buff 的工具类

    断言 断言是一个逻辑判断 xff0c 用于检查不应该发生的情况 Assert 关键字在 JDK1 4 中引入 xff0c 可通过 JVM 参数 enableassertions开启 SpringBoot 中提供了 Assert 断言工具类
  • SpringBoot四大核心组件

    前言 先透露一下 xff0c 四大组件分别是 xff1a starter xff0c autoconfigure CLI 以及actuator 下面我们就来详细介绍一些他们有什么用 一 Spring Boot Starter 1 1 Sta
  • 线上问题排查,这些命令你一定用得到!

    线上问题排查 xff0c 以下场景 xff0c 你遇到过吗 xff1f 一 了解机器连接数情况 问题 xff1a 1 2 3 4的sshd的监听端口是22 xff0c 如何统计1 2 3 4的sshd服务各种连接状态 TIME WAIT C
  • linux内核发包工具pktgen

    pktgen使用说明 内核路径 net core pktgen c 作者对于pktgen的介绍 xff1a 原作者编写的pdf介绍 pktgen c 原理介绍 pktgen运用了proc 文件系统特征来实现用户和内核的交互 xff0c 用户
  • 用css写进度条

    用css写进度条 我们平时写进度条一般是一个父div包裹一个子div xff0c 用js控制子div的宽度 实现进度条 xff0c 我们现在可以用css简单实现进度条了 代码如下 xff1a 在vue项目里咱们只需要控制数字就行了 xff0
  • SpringBoot集成SpringSecurity

    SpringSecurity 安全简介 在 Web 开发中 xff0c 安全一直是非常重要的一个方面 安全虽然属于应用的非功能性需求 xff0c 但是应该在应用开发的初期就考虑进来 如果在应用开发的后期才考虑安全的问题 xff0c 就可能陷
  • 【ElementUI】进度条 el-progress—进度圆环颜色、自定义文字

    圆环不显示 大概率是因为宽度没有设置 el progress width 100 圆圈背景色 lt el progress type 61 34 circle 34 percentage 61 34 20 34 class 61 34 pe
  • linux使用curl加双引号进行转义

    amp 是个特殊符号 xff0c 如果在控制台使用curl curl http 127 0 0 1 8089 ceshi startTime 61 2018 10 24 02 49 35 amp amp endTime 61 2018 10
  • qt程序的CMakeLists.txt配置转为平台的qt的.pro项目工程文件

    参考这个 跨平台qt程序的CMakeLists txt配置转为平台的qt的 pro项目工程文件 谁能懂我2011的博客 CSDN博客 一些比较正规的跨平台qt项目没有 pro项目文件只有CMakeLists txt文件 xff0c 如果要编

随机推荐

  • 单片机堆栈是什么?它的原理和作用又是什么?

    什么是单片机堆栈 xff1f 在片内RAM中 xff0c 常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出 LIFO FILO 的原则 这个RAM区叫堆栈 它的作用 子程序调用和中断服务时CPU自动将当前PC值压栈保存
  • IMU(陀螺仪、加速度计)&Magnetometer(磁力计)校准方法和流程

    一 何为校准 xff1a 校准的目的是因为厂商在生产器件时 xff0c 由于工艺 技术等原因 xff0c 致使器件存在缺陷 xff0c 导致实际应用时 xff0c 存在误差 xff01 一般器件在出厂时 xff0c 都会做一些校准处理 xf
  • matlab运行RTKDEMO几个小函数

    一 matlab函数 xff1a 1 datenum 将时间点转换为0000年1月0日到现在的天数 xff01 其中起点为 xff1a 0000年1月0日 例如 xff1a K gt gt t0 61 datenum 2005 4 2 0
  • 糖儿飞教你学C++ Socket网络编程——8. 异步通信版的TCP通信程序

    项目3 3中实现的通信程序仍然有很多不足 xff0c 最明显的不足是 xff0c 通信双方不能自动接收对方消息 xff0c 需要单击 接收 按钮才能接收 另外的问题是 xff0c 在服务器端单击 创建服务器 按钮后 xff0c 如果没有客户
  • VINS-Mono

    文章目录 初始化框架缺点ORB SLAM的Local Map VINS的滑窗 逐次逼近式去畸变给后端提供的特征点信息光流追踪对极约束F去除外点 rejectWithF 特征点均匀化预积分系统初始化初始化时不校正bias a误差卡尔曼滤波误差
  • python-异常

    https docs python org 3 library exceptions html 异常 程序在运行过程中 xff0c 不可避免的出现一些错误 没有赋值的变量使用了不存在的索引除0 这些错误在程序中 xff0c 称为异常程序运行
  • STM32CubeMX串口USART中断发送接收数据

    本文代码使用 HAL 库 文章目录 前言一 中断控制二 USART中断使用1 中断优先级设置 xff1a 2 使能中断3 使能UART的发送 接收中断4 中断收发函数5 中断处理函数6 中断收发回调函数 三 串口中断实验串口中断发送数据点亮
  • 关于gcc、make和CMake的区别

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • gcc与g++的区别

    一 编译的四个阶段 预处理 xff1a 编译处理宏定义等宏命令 xff08 eg define xff09 生成后缀为 i 的文件 编译 xff1a 将预处理后的文件转换成汇编语言 生成后缀为 s 的文件 汇编 xff1a 由汇编生成的文件
  • 网络编程第一篇之Select模式

    网络编程第一篇之Select模式 今天总结下Select模式下网络编程模型 xff0c 首先我们要知道一个高级的技术 xff0c 绝对不是凭空产生的 xff0c 它一定是在原来的技术上由于满足不了需求 xff0c 然后经过不断的打磨 xff
  • 佛学八正道

    八正道包括正见 正思惟 正语 正业 正命 正精进 正念 正定 大毘婆娑论 说 xff1a 由正见故 xff0c 起正思惟 xff1b 由正思惟故 xff0c 得正语 xff1b 由正语故 xff0c 复得正业 xff1b 由正业故 xff0
  • C语言疑难点汇总解析

    1 大小端知识点 1 1 大小端定义 1 Little Endian就是低位字节排放在内存的低地址端 xff0c 高位字节排放在内存的高地址端 2 Big Endian就是高位字节排放在内存的低地址端 xff0c 低位字节排放在内存的高地址
  • 常见硬件接口汇总(未完待续)

    1 UART 通用异步收发器 xff0c 用于收发数据的串并转换 2 I2C 双线串行接口 3 I3C 4 SCI SIM卡接口 xff0c 接在APB总线上 xff0c 用于与外部读卡器通信 实际也是串并转换的通信方式 5 CSI 6 P
  • 芯片的ATE测试简介

    ATE xff1a Automatic Test Equipment xff0c 即自动测试设备 xff0c 它用于芯片大规模生产测试 xff0c 保障稳健 xff08 质量 成本和进度 xff09 的供应 ATE测试基本的覆盖理念 xff
  • Android发展历程

    发展历程 2003年10月 xff0c Andy Rubin等人创建Android公司 xff0c 并组建Android团队 2005年8月17日 xff0c Google低调收购了成立仅22个月的高科技企业Android及其团队 安迪鲁宾
  • Android系统源码目录详解

    关于源码的阅读 xff0c 你可以访问 xff1a http androidxref com 我们要先了解Android系统源码目录 xff0c 为后期源码学习打下基础 当然 xff0c 最好是将源码下载下来 下载源码可以使用清华大学开源软
  • 使用Iperf工具测试WiFi的吞吐量

    1 windows 上测试网路吞吐量工具 对于window测试网络吞吐量的工具 http download csdn net download leekwen 3427386 iperf windows版测试软件 针对wifi性能进行测试
  • C++封装的HTTP和HTTPS的接口

    记录下http和https的post方法 在C 43 43 中实现 来源无从考究了 xff0c 这里记录一下 http 的post 方法 BOOL HttpPostToBusinessServer LPCTSTR serverAddr st
  • (*((volatile unsigned long *) 0xE0028000)) 作用小解

    define IO0PIN volatile unsigned long 0xE0028000 no in lpc210x 以此句为例 简述如下 与51单片机的头文件 lt reg51 h gt 类似 在ARM处理器中 也必须有自己的寄存器
  • (M052)利用PWM波实现LED灯亮度调节

    include lt stdio h gt include lt stdint h gt include 34 M051 h 34 include 34 Register Bit h 34 include 34 Common h 34 in