Arduino基础(一)——语言基础

目录:

1,语言基础:https://blog.csdn.net/SumubeiFZ/article/details/118603957
2,串口通讯:https://blog.csdn.net/SumubeiFZ/article/details/118638228
3,基础实验操作:https://blog.csdn.net/SumubeiFZ/article/details/118638290
4,中断:https://blog.csdn.net/SumubeiFZ/article/details/118638320
 

 概况:

Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。

Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。目前最新的Arduino核心库采用C与C++混合编写而成。

基本结构:

Arduino程序基本结构由setup() loop() 两个函数组成:

(1)

void setup()
{
  // 在这里加入你的setup代码,它只会运行一次:
}

Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。

通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。

(2)

void loop()
{
  // 在这里加入你的loop代码,它会不断重复运行:
}[/mw_shl_code]

在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。

通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。

数据类型以及常量和变量:

在C\C++语言程序中,对所有的数据都必须指定其数据类型。数据又有常量和变量之分。

需要注意的是,Arduino Uno与AVR做核心的Arduino中的部分数据类型所占用的空间和取值范围有所不同。

变量和定义格式与c\c++大体相同。

变量:类型 变量名
int i;
//或者
int i;
i=95;
//或者
int i=95;

常量:
(1)const 类型 常量名 = 常量值
(2)#define 宏名 值
如:#define PI 3.1415926535897932384626433832795

#define宏定义

宏定义是C语言提供的一种预处理方式,其允许使用标识符来表示一个字符串,编译器在开始编译前,会将代码中标识符全部替换成对应的字符串,以达到对程序预先处理的目的。合理使用宏定义,可以简化代码编写,避免输入及语法错误,提高程序可读性。

(1)整型

整型即整数类型。Arduino Uno可使用的整型数据取值范围如下

在Arduino Due、Zero中,int及unsigned int占用4字节(32位)。

(2)浮点型

浮点数也就是常说的实数。在Arduino中有float和double两种浮点类型,在Arduino Uno中,float类型占用4个字节(32位)内存空间,double类型占用8个字节(64位)内存空间;在Arduino Due、Zero中,double类型占用8字节(64位)内存空间。

浮点型数据的运算速度较慢且有一定误差,因此,通常会把浮点型转换为整型再进行相关运算。如9.8cm,通常会换算为98mm再计算。

(3)字符型

字符型,即char类型,也是一种整形,占用一个字节内存空间,常用于存储字符变量。存储字符时,字符需要用单引号引用,如

char col='C';

字符都是以整数形式储存在char类型变量中的,数值与字符的对应关系,请参照附录中ASCII码表。

(4)布尔型

布尔型变量,即boolean。它的值只有两个:false(假)和true(真)。boolean会占用1个字节的内存空间

运算符

C\C++语言中有多种类型的运算符,常见运算符见表:

数组

数组是由一组相同数据类型的数据构成的集合。数组概念的引入,使得在处理多个相同类型的数据时,程序更加清晰和简洁。

定义:据类型 数组名称 [数组元素个数];

调用:数组名称 [下标]

需要注意的是数组下标是从0开始编号的

字符串

字符串的定义方式有两种,一种是以字符型数组方式定义,另一种是使用String类型定义。

(1)char 字符串名称  [字符个数];

(2)String 字符串名称;

使用字符型数组的方式定义,使用方法和数组一致,有多少个字符便占用多少个字节的存储空间。

大多数情况下,可以使用String类型来定义字符串,该类型中提供一些操作字符串的成员函数,使得字符串使用起来更为灵活。

相较于数组形式的定义方法,使用String类型定义字符串会占用更多的存储空间。

转载自:布尔博客 – 高校青年技术社区

### HAL_TIM_PeriodElapsedCallback 函数功能与用法 #### 1. 功能描述 `HAL_TIM_PeriodElapsedCallback` 是 STM32 HAL 库中的回调函数,用于处理定时器周期结束事件。当定时器的计数值达到设定的最大值并触发更新事件时,该回调函数会被调用[^1]。 此函数的主要作用是在中断服务程序中被自动调用,允许用户在不修改底层驱动的情况下实现自定义逻辑。它通常用来响应特定的时间间隔到达后的动作,例如刷新数据、切换状态或其他实时任务调度[^2]。 --- #### 2. 定义形式 以下是 `HAL_TIM_PeriodElapsedCallback` 的典型定义: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 用户可以在此处编写自己的代码来处理定时器周期溢出事件 } ``` - **参数说明** - `TIM_HandleTypeDef *htim`: 这是个指向定时器句柄结构体的指针,包含了配置和运行状态的信息。通过这个句柄,可以在回调函数内部访问当前定时器的相关属性或重新设置其行为。 --- #### 3. 使用方法 为了使能这回调机制,需完成以下几个步骤: 1. 初始化定时器:利用 `HAL_TIM_Base_Init` 或其他初始化接口完成硬件资源分配以及基础参数配置(如预分频系数、计数器周期等)。 2. 启动带中断模式的定时器:调用 `HAL_TIM_Base_Start_IT(htim)` 来开启定时器及其关联的中断请求。这步会启用相应的中断线,并注册默认的中断服务例程(ISR)[^1]。 3. 实现回调函数:根据实际需求重写 `HAL_TIM_PeriodElapsedCallback` 方法的内容。每当发生次完整的计数循环后,即进入下轮计数前,都会跳转到此处执行指定的操作[^3]。 4. 清除标志位/中断挂起比特 (可选): 如果需要手动管理某些特殊类型的干扰信号,则可能还需要借助宏指令如 __HAL_TIM_CLEAR_IT() 对应位置零操作。 --- #### 示例代码片段 下面展示了个简单的应用案例——每秒钟点亮 LED 次: ```c #include "stm32f4xx_hal.h" // 假设已正确设置了 GPIO 和 TIM 句柄 htim2 uint8_t led_state = 0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM2){ // 判断是否来自 TIM2 中断 if(led_state == 0){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 打开LED led_state = 1; } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭LED led_state = 0; } } } int main(void){ /* MCU Initialization */ // 配置GPIO PA5作为输出端口 // 设置 TIM2 参数 TIM_HandleTypeDef timHandle; timHandle.Instance = TIM2; timHandle.Init.Prescaler = 8399; // 设定预分频值使得频率接近1KHz timHandle.Init.CounterMode = TIM_COUNTERMODE_UP; timHandle.Init.Period = 9999; // 计数至最大值约等于秒 timHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&timHandle) != HAL_OK){ Error_Handler(); } // 开启 IT 模式的定时器 HAL_TIM_Base_Start_IT(&timHandle); while(1); } ``` 上述例子展示了如何结合外部设备控制形成规律性的脉冲序列。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值