代码编织梦想

lab 8

亮度变化

练习要求

新建交通信号灯keil工程,

设置三个不同的亮度级(0最暗,9最亮),控制LED2亮白色并以这三种亮度循环闪烁,每种亮度保持时间为1秒(比如013,那么分别使用0,1,3三个数字来设置3个不同大小的占空比)。

/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>

#define random(x) (rand()%x)+10

#define TA1_PERIODS (62500)
#define PWM_PERIODS (62500/50)

static int state = 0;
//TimerA0采用了CCR1,CCR2,CCR3通道,就禁用CCR0和定时器中断
const Timer_A_UpModeConfig TA0 =     
{
        TIMER_A_CLOCKSOURCE_SMCLK,              // 选用SMCLK作为时钟源
        TIMER_A_CLOCKSOURCE_DIVIDER_1,          // 分频系数为1,Timer_A0=SMCLK/1=62.5k
        PWM_PERIODS-1,                          // 周期时长=PWM_PERIODS/Timer_A0=20ms(注:视觉暂留时间约为100ms至400ms),因从零开始计数,建议做减一操作;
        TIMER_A_TAIE_INTERRUPT_DISABLE,         // 禁用定时器中断
        TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE,    // 禁用定时器CCR0中断
        TIMER_A_DO_CLEAR                        // 清空数值
};

Timer_A_CompareModeConfig TA0_CCR1_PWM =
{
        TIMER_A_CAPTURECOMPARE_REGISTER_1,          // CCR1通道
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE,   // 禁用CCR中断
        TIMER_A_OUTPUTMODE_RESET_SET,               // 采用复位/置位
        PWM_PERIODS                                 // 占空比,此处不用减一,当定时器数值val<PWM_PERIODS时,输出高电平(即0到PWM_PERIODS-1,共PWM_PERIODS);当val>=PWM_PERIODS时输出低电平
};

Timer_A_CompareModeConfig TA0_CCR2_PWM =
{
        TIMER_A_CAPTURECOMPARE_REGISTER_2,         // CCR2通道
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE,  // 禁用CCR中断
        TIMER_A_OUTPUTMODE_RESET_SET,              // 采用复位/置位
        PWM_PERIODS    
};

Timer_A_CompareModeConfig TA0_CCR3_PWM =
{
        TIMER_A_CAPTURECOMPARE_REGISTER_3,        // CCR3通道
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // 禁用CCR中断
        TIMER_A_OUTPUTMODE_RESET_SET,             // 采用复位/置位
        PWM_PERIODS    
};

const Timer_A_UpModeConfig TA1 =
{
        TIMER_A_CLOCKSOURCE_SMCLK,              // 选用SMCLK作为时钟源
        TIMER_A_CLOCKSOURCE_DIVIDER_1,          // 分频系数为1,Timer_A1=SMCLK/1=62.5k
        TA1_PERIODS-1,                          // 周期时长=TA1_PERIODS/Timer_A1=1s,因从零开始计数,建议做减一操作;
        TIMER_A_TAIE_INTERRUPT_DISABLE,         // 禁用定时器中断
        TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,    // 使能定时器CCR0中断
        TIMER_A_DO_CLEAR                        // 清空数值
};


int main(void)
{
    uint8_t port_mapping[]=
    {
        PM_TA0CCR1A, //映射至Timer_A0_CCR1,与Pin0对应
        PM_TA0CCR2A, //映射至Timer_A0_CCR2,与Pin1对应
        PM_TA0CCR3A, //映射至Timer_A0_CCR3,与Pin2对应
        PM_NONE,     //不映射,映射为空
        PM_NONE,
        PM_NONE,
        PM_NONE,
        PM_NONE
    };    

    // 停用看门狗
    MAP_WDT_A_holdTimer();

    //![Simple FPU Config]   
    MAP_FPU_enableModule();//*启用FPU加快DCO频率计算,注:DCO是内部数字控制振荡器,默认是3M频率*/
    MAP_CS_setDCOFrequency(1000000);//* 设置DCO频率为指定频率,此处DCO=1M*/
    MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);//*设置MCLK(主时钟,可用于CPU主频等),MCLK=DCO频率/时钟分频系数,此处MCLK=DCO=1M*/
    MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1); //设置HSMCLK(子系统主时钟),HSMCLK=DCO频率/时钟分频系数,此处HSMCLK=DCO=1M*/
    MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_16);//*设置SMCLK(低速子系统主时钟,可用TimerA频率),SMCLK=DCO频率/时钟分频系数,此处SMCLK=DCO/16=62.5K*/
    //![Simple FPU Config]    
    
    //*将TimerA0的CCR1、CCR2及CCR3,和P2.0、P2.1及P2.2一一映射,并使能*/
    MAP_PMAP_configurePorts((const uint8_t *)port_mapping,PMAP_P2MAP/*端口2*/,1/*8个引脚*/,PMAP_DISABLE_RECONFIGURATION);
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2,GPIO_PIN0|GPIO_PIN1|GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION); 
    
    //*TimerA0使用SMCLK作为时钟源,禁用CCR0中断,增计数模式*/
		//TimerA0只用三个通道计数,不中断
    MAP_Timer_A_configureUpMode(TIMER_A0_BASE,&TA0);
    
    //*TimerA1使用SMCLK作为时钟源,启用CCR0中断,定时周期为1s,增计数模式*/
    MAP_Timer_A_configureUpMode(TIMER_A1_BASE,&TA1); 
    
    MAP_Interrupt_enableInterrupt(INT_TA1_0); //*使能TimerA1 CCR0中断*/
    MAP_Interrupt_enableMaster(); //*使能中断总开关*/
     
    MAP_Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);//*以增计数模式启动TimerA0*/
    MAP_Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);//*以增计数模式启动TimerA1*/
    
    while (1); //打结
}


unsigned int order = 0;
double light[] = {1,4,9};

void TA1_0_IRQHandler(void)
{
   
    order = (order + 1) % 3;
    TA0_CCR1_PWM.compareValue =PWM_PERIODS* light[order] / 9;
    MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);  /*使用随机数设置TimerA0 CCR1(连接LED2的红灯)的PWM占空比*/
    TA0_CCR2_PWM.compareValue =PWM_PERIODS*light[order] / 9;
    MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);  /*使用随机数设置TimerA0 CCR2(连接LED2的绿灯)的PWM占空比*/
    TA0_CCR3_PWM.compareValue =PWM_PERIODS*light[order] / 9;
    MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);  /*使用随机数设置TimerA0 CCR3(连接LED2的蓝灯)的PWM占空比*/
    //pwmConfig(light[order]);
    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);/*清空TimerA1 CCR0中断标志*/
    

}

呼吸灯

使用定时器选择自己喜欢的颜色实现一个氛围呼吸灯的效果(渐亮渐灭)。

/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>

#define random(x) (rand()%x)+10

#define TA1_PERIODS (62500)
#define PWM_PERIODS (62500/50)

static int state = 0;
//TimerA0采用了CCR1,CCR2,CCR3通道,就禁用CCR0和定时器中断
const Timer_A_UpModeConfig TA0 =     
{
        TIMER_A_CLOCKSOURCE_SMCLK,              // 选用SMCLK作为时钟源
        TIMER_A_CLOCKSOURCE_DIVIDER_1,          // 分频系数为1,Timer_A0=SMCLK/1=62.5k
        PWM_PERIODS-1,                          // 周期时长=PWM_PERIODS/Timer_A0=20ms(注:视觉暂留时间约为100ms至400ms),因从零开始计数,建议做减一操作;
        TIMER_A_TAIE_INTERRUPT_DISABLE,         // 禁用定时器中断
        TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE,    // 禁用定时器CCR0中断
        TIMER_A_DO_CLEAR                        // 清空数值
};
Timer_A_CompareModeConfig TA0_CCR1_PWM =
{
        TIMER_A_CAPTURECOMPARE_REGISTER_1,          // CCR1通道
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE,   // 禁用CCR中断
        TIMER_A_OUTPUTMODE_RESET_SET,               // 采用复位/置位
        PWM_PERIODS                                 // 占空比,此处不用减一,当定时器数值val<PWM_PERIODS时,输出高电平(即0到PWM_PERIODS-1,共PWM_PERIODS);当val>=PWM_PERIODS时输出低电平
};
Timer_A_CompareModeConfig TA0_CCR2_PWM =
{
        TIMER_A_CAPTURECOMPARE_REGISTER_2,         // CCR2通道
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE,  // 禁用CCR中断
        TIMER_A_OUTPUTMODE_RESET_SET,              // 采用复位/置位
        PWM_PERIODS    
};
Timer_A_CompareModeConfig TA0_CCR3_PWM =
{
        TIMER_A_CAPTURECOMPARE_REGISTER_3,        // CCR3通道
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // 禁用CCR中断
        TIMER_A_OUTPUTMODE_RESET_SET,             // 采用复位/置位
        PWM_PERIODS    
};
const Timer_A_UpModeConfig TA1 =
{
        TIMER_A_CLOCKSOURCE_SMCLK,              // 选用SMCLK作为时钟源
        TIMER_A_CLOCKSOURCE_DIVIDER_1,          // 分频系数为1,Timer_A1=SMCLK/1=62.5k
        TA1_PERIODS-1,                          // 周期时长=TA1_PERIODS/Timer_A1=1s,因从零开始计数,建议做减一操作;
        TIMER_A_TAIE_INTERRUPT_DISABLE,         // 禁用定时器中断
        TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,    // 使能定时器CCR0中断
        TIMER_A_DO_CLEAR                        // 清空数值
};

int main(void)
{
    uint8_t port_mapping[]=
    {
        PM_TA0CCR1A, //映射至Timer_A0_CCR1,与Pin0对应
        PM_TA0CCR2A, //映射至Timer_A0_CCR2,与Pin1对应
        PM_TA0CCR3A, //映射至Timer_A0_CCR3,与Pin2对应
        PM_NONE,     //不映射,映射为空
        PM_NONE,
        PM_NONE,
        PM_NONE,
        PM_NONE
    };    

    /* 停用看门狗*/
    MAP_WDT_A_holdTimer();

    //![Simple FPU Config]   
    MAP_FPU_enableModule();/*启用FPU加快DCO频率计算,注:DCO是内部数字控制振荡器,默认是3M频率*/
    MAP_CS_setDCOFrequency(100000);/* 设置DCO频率为指定频率,此处DCO=1M*/
    MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);/*设置MCLK(主时钟,可用于CPU主频等),MCLK=DCO频率/时钟分频系数,此处MCLK=DCO=1M*/
    MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);/*设置HSMCLK(子系统主时钟),HSMCLK=DCO频率/时钟分频系数,此处HSMCLK=DCO=1M*/
    MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);/*设置SMCLK(低速子系统主时钟,可用TimerA频率),SMCLK=DCO频率/时钟分频系数,此处SMCLK=DCO/16=62.5K*/
    //![Simple FPU Config]    
    
    /*将TimerA0的CCR1、CCR2及CCR3,和P2.0、P2.1及P2.2一一映射,并使能*/
    MAP_PMAP_configurePorts((const uint8_t *)port_mapping,PMAP_P2MAP/*端口2*/,1/*8个引脚*/,PMAP_DISABLE_RECONFIGURATION);
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2,GPIO_PIN0|GPIO_PIN1|GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION); 
    
    /*TimerA0使用SMCLK作为时钟源,禁用CCR0中断,增计数模式*/
		//TimerA0只用三个通道计数,不中断
    MAP_Timer_A_configureUpMode(TIMER_A0_BASE,&TA0);
    
    /*TimerA1使用SMCLK作为时钟源,启用CCR0中断,定时周期为1s,增计数模式*/
    MAP_Timer_A_configureUpMode(TIMER_A1_BASE,&TA1); 
    
    MAP_Interrupt_enableInterrupt(INT_TA1_0); /*使能TimerA1 CCR0中断*/
    MAP_Interrupt_enableMaster(); /*使能中断总开关*/
    
    MAP_Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);/*以增计数模式启动TimerA0*/
    MAP_Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);/*以增计数模式启动TimerA1*/
    
    while (1); //打结
}

/*
uint32_t breath[] = { CS_CLOCK_DIVIDER_4, CS_CLOCK_DIVIDER_8, 
				CS_CLOCK_DIVIDER_16, CS_CLOCK_DIVIDER_32, CS_CLOCK_DIVIDER_64, CS_CLOCK_DIVIDER_128, CS_CLOCK_DIVIDER_64, CS_CLOCK_DIVIDER_32, CS_CLOCK_DIVIDER_16,
				CS_CLOCK_DIVIDER_8, CS_CLOCK_DIVIDER_4};*/
double light[] = {0, 2, 4, 6, 8, 10, 8, 6, 4, 2, 0};
unsigned int order = 0;
void mydelay(int cnt)
{
	int i = cnt * 8000;
	while(i--);
}
void TA1_0_IRQHandler(void)
{
    order = (order + 1) % 11;
    MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
    MAP_Timer_A_configureUpMode(TIMER_A1_BASE,&TA1); 
    MAP_Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);

    TA0_CCR1_PWM.compareValue =PWM_PERIODS* light[order] / 20;
    MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);  

    TA0_CCR2_PWM.compareValue =PWM_PERIODS* light[order] / 20;
    MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);  

    TA0_CCR3_PWM.compareValue =PWM_PERIODS* light[order] / 20;
    MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);  
    mydelay(light[order]);
    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);/*清空TimerA1 CCR0中断标志*/
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JamSlade/article/details/129416400

如何学习单片机——从51过渡到stm32-爱代码爱编程

                                                           --------- 前言 ---------        鉴于原文只介绍了51单片机的学习路线(当时STM32刚兴起),与当前流行的STM32等高端单片机相比,显得有些落后,所以笔者更新了此文。 一、51和STM32的区别。 STM

开始学习arm拉....开课了-爱代码爱编程

给自己的业余时间进行了规划,主要是学习和参考《朱老师物联网大讲堂》的嵌入式视频。并进行了自己的一些总结: 0基础入门ARM嵌入式,希望给有需要的朋友进行帮助!我会继续努力加油!再次感谢朱老师的视频~~ 一、简单介绍一下的

KEIL5 创建STM32工程V3.5固件库(全过程)-爱代码爱编程

       前几天把C语言都复习完了,打算开始把STM32学一遍,巩固一下单片机的知识。由于之前做比赛用的是NXP的LPC54606和KEA128,学校的单片机课程也是MSP430F5529,所以到现在还没接触过STM32,就想着在秋招前先过一遍。   学习STM32看的并不是正点原子的视频,选择了刘凯的视频。等我刘凯的视频学习完后会用正点原子的视频快速

嵌入式之STM之汇编程序设计-爱代码爱编程

嵌入式之STM之汇编程序设计 STM32的三种Boot模式的差异一.什么是BOOT模式二、Keil汇编程序生成 hex文件的大小及含义三.汇编程序完成一个输出“Hello world”到串口的程序 STM32的三种Boot模式的差异 一.什么是BOOT模式 在STM32 的板子上,有 BOOT0 、BOOT1 两个管脚,用短路帽将 BOOT

【嵌入式】基于MDK创建纯汇编语言的STM32工程-爱代码爱编程

目录 一、实验准备二、汇编语言工程1.新建工程2.硬件连接3.相关代码4.编译烧录5.hex文件分析三、输出串口工程1.工程与代码2.编译运行四、参考 一、实验准备 实验目的: 在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义,并在此基础上用汇编程

STM32基于汇编方式创建工程(原理与实例)-爱代码爱编程

文章目录 一、创建工程二、编写代码三、分析生成的 hex 文件四、基于 MDK 创建 STM32 汇编程序:串口输出 Hello world五、总结六、参考 一、创建工程 实验所用环境为MDK keil5 Project ——> New uVision Project 选择芯片,我用的开发板是野火STM32F103MINI,芯片选择为S

STM32 的 USART 串口通讯---汇编输出 hello windows-爱代码爱编程

文章内容: 1、了解何为 USART 串口通信,了解串口协议和 RS-232 标准,以及 RS232 电平与 TTL 电平的区别; 了解" USB/TTL转232 "模块(以 CH340 芯片模块为例)的工作原理。 2、完成一个 STM32 的 USART串口通讯程序(查询方式即可,暂不要求采用中断方式)。 要求:1)设置波特率为115200,1位停

物联网arm开发-1stm32背景知识_4iot的博客-爱代码爱编程

目录 一、ARM背景知识 1、ARM含义 2、ARM处理器架构 3、指令集 4、SOC(片上系统) 二cortex-M4 1、cortexM家族 2、M4特性 3、M结构框图 4、工作模式 5、寄存器组-通用寄存器 6、特殊寄存器 7、异常和中断 8、Cortex-M4指令集 三、认识STM32 1、应用 2、产品命名规范

基于cortex-m7内核stm32f767nih6,stm32f767vgt6,stm32f767vit6嵌入式技术资料-爱代码爱编程

STM32F7 32 位 MCU+FPU 基于高性能的 ARM®Cortex-M7 32 位 RISC 内核®,工作频率高达 216MHz。Cortex®-M7 内核具有单浮点单元(SFPU)精度,支持所有 ARM® 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元(MPU),增强应用安全性。 Cortex-M7 MCU STM

嵌入式开发(8)c与汇编混合运用_msr_msp函数-爱代码爱编程

目录 1、从汇编中调用C语言2、从C语言中调用汇编函数3、嵌入汇编4、内联汇编5、内嵌汇编问题解决总结 今天遇到了个问题,研究了一下。 当我初始化完LED,想尝试去使用位带操作来操控GPIO脚,