(三)定时器
(三)定时器一、MSP430单片机的定时器概述MSP430共有4个16位定时器,主要包括定时器A的0、1、2以及定时器B,每个定时器输出通道个数不同。 时钟源包括ACLK、SMCLK和TACLK 二、定时器的工作模式定时器主要包括4个工作模式: ① 停止模式。 停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。例如,停止模式前,Timer_A定时器工作于增/减计数模式并且处于下降计数方向,停止模式后,Timer_A仍然工作于增/减计数模式下,从暂停前的状态开始继续沿着下降方向开始计数。若不想这样,则可通过TAxCTL中的TACLR控制位来清除定时器的计数及方向记忆特性。 ②...
(四)串口
(四)串口一、MSP430单片机串口概述MSP430具有2个串口,分别为USCI_A0和USCI_A1。 USCI_A0_BASE:P3.3, P3.4 = USCI_A0 TXD/RXD (板上空闲的) USCI_A1_BASE:P4.4, P4.5 = USCI_A1 TXD/RXD (USB是该串口) 二、串口相关函数(1)UART配置和控制的相关函数 1234567891011121314USCI_A_UART_init(uint16_t baseAddress, USCI_A_UART_initParam ∗param)//初始化函数USCI_A_UART_enable(uint16_t baseAddress)//使能UART模块USCI_A_UART_disable(uint16_t baseAddress)//失能UART模块USCI_A_UART_setDormant(uint16_t baseAddress)//将UART模块设置为休眠模式USCI_A_UART_resetDormant(uint16_t...
(二)外部中断
(二)外部中断1.中断概述MSP430单片机的中断优先级是固定的,由硬件确定,用户不能更改。当多个中断同时发生中断请求时,CPU按照中断优先级的高低顺序依次响应。MSP430单片机包含3类中断源:系统复位中断源、不可屏蔽中断源和可屏蔽中断源。 可屏蔽中断源是具有中断功能的片上外设所产生的。由状态寄存器SR的GIE位控制,当GIE=0时,所有中断使能。当GIE=1时,所有中断使能 以下是MSP430所有中断 在使用外部中断时,由于其是可屏蔽中断,所以必须要置位GIE 可以通过 123_EINT();//开启_DINT();//关闭 或者 12__bis_SR_register(GIE);//开启__bic_SR_register(GIE);//关闭 开启或关闭。 2.中断写法1234567891011121314151617#pragma vector = PORT2_VECTOR // P2口中断源__interrupt void Port_2 (void) // 声明一个中断服务程序,名为Port_2(){ ...
HAL串口中断
HAL串口中断1.每次使用串口中断前必须初始化一下1HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH);//指定缓冲区以及触发中断的长度 ==每次中断后都得在用一次该语句,不然就只能触发一次中断,第一次中断前初始化时也要写这句== 2.串口发送函数12HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。 参数: UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1*pData 需要发送的数据Size 发送的字节数Timeout ...
HAL库外设配置方法
STM32 HAL各种外设配置方法(不包括CubeMX)1.外部中断只需要在CubeMX里对IO配置,自己重写一下回调函数就行了 123456789101112131415161718192021void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin==KEY0_Pin) { HAL_Delay(10);/* 延时一小段时间,消除抖动 */ if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_RESET) flag=0; } else if(GPIO_Pin==KEY2_Pin) { HAL_Delay(10);/* 延时一小段时间,消除抖动 */ if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET) flag=1; } else...
Keil的Debug技巧
Debug 技巧1.Debug时,黄色箭头代表程序运行到哪里了,蓝色箭头是鼠标移动的位置 2.可以通过看Systick的值来计算语句运行的时间 3.从Watch Window可以设置在某变量发生变化时设置断点 4.单步调试【单步调试】也就是每点⼀次按钮,程序运⾏⼀步。遇到函数会进⼊函数。点击图标按钮,或者按快捷键F11。(这⾥取消上⾯的断点) 5.逐步调试【逐步调试】即逐⾏调试,也就是每点⼀次按钮,程序运⾏⼀⾏。遇到函数不会进⼊函数。点击图标按钮,或者按快捷键F10。 6.跳出调试【跳出调试】即挑出函数调试,也就是每点⼀次按钮,程序跳出⼀个函数,直到跳出最外⾯的函数(main函数)。点击图标按钮,或者按快捷键Ctrl + F11。 7.运⾏到光标处【运⾏到光标处】即将光标放在某⼀处,点击该按钮(或Ctrl +...
IIC
IIC1.IIC的地址问题 IIC中的器件地址DEV_ADDRESS是7位地址,但C语言中没有7bit的数据类型,所以你只能传uint8_t的数据进去。HAL库会把这个变量的高7位提取出来作为地址,根据实际情况对最后一个读写位set或reset。 通常数据手册在表述地址的时候,地址是在一个8位二进制数的低7位,比如6050就是0x68=0110 1000,但HAL库IIC传进去的地址在一个8位二进制数的高7位,就变成了0xD0(写)或者0xD1(读)这点要注意。 HAL库你在传地址的时候不需要自己考虑第8位是0还是1,它那个函数内部会自动根据你调用的是IIC读还是IIC写来对那一位进行运算。不过你要是非要传第8位已经写0或1的地址进去也行,因为运算结果不会变,只要你不写反就行了 2. IIC的数据传输IIC一般根据从机寄存器的位数来确定一次传几个字节的数据。通过以下函数中的 Size参数可以设定传输数据的字节数 12345HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,...
SPI
SPI学习1.SPI的物理结构 MOSI:主设备输出,从设备输入 MISO:主设备输入,从设备输出 SCK:时钟信号线 CS:设备片选,低电平表示被选择 一个SPI接口可以同时连接多组从设备,只需要增加CS线即可 用CUBEMX设置SPI默认只有3个引脚(没有CS),如果下面开启了NSS,系统会自动给你指定一个CS引脚,否则就要自己指定CS引脚 在通信开始/结束时,手动控制CS引脚的电平 2.SPI工作原理主机和从机内部都有一个移位寄存器,主机发送数据时,同时也会受到一组数据,不过不需要对该数据处理。主机接收数据时,要给从机发送一组没有意义的数据,同时接收数据。 3.寄存器相关的寄存器有2组 CPOL(时钟极性寄存器):控制高电平还是低电平时空闲状态 CPHA(相位控制寄存器):控制是奇数还是偶数跳变是读取数据 这个怎么选一般要看芯片手册 4.SPI的其他参数
SysTick详解
SysTick详解SysTick定时器简介SysTick定时器也叫SysTick滴答定时器,它是Cortex内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。 SysTick定时器作为HAL_Delay的基准在cube生成的代码中,main函数中HAL_RCC_ClockConfig();初始化系统时钟的时候Systick被初始化。初始化时,Cube默认设置Systick中断优先级为最高优先级,中断周期由函数HAL_SYSTICK_Config(SystemCoreClock / (1000U /...
内存的分区
内存的分区及存放位置一、内存分区介绍程序中内存有以下分区: 栈区(stack) 临时创建的局部变量存放在栈区。 函数调用时,其入口参数存放在栈区。 函数返回时,其返回值存放在栈区。 const定义的局部变量存放在栈区。 堆区(heap)堆区用于存放程序运行中被动态分布的内存段,可增可减。 可以有malloc等函数实现动态分布内存。 有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。 全局区(静态区)(static)内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。它主要存放静态数据(局部static变量,全局static变量)、全局变量。当程序结束后,变量由系统释放 。 常量区存放数字 和 常量字符串。当程序结束后,由系统释放 。 常量区的内容不可以被修改。 代码区存放函数体的二进制代码。 123456789101112131415161718192021222324//main.cpp#include <iostream>using namespace std;#include...