32 TSN 内部温度传感器

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
TSN 内部温度实验
本章目标:
- 了解 RA6M5 处理器的 ADC 模块
- 学会使用 RASC 配置 ADC 读取芯片内部温度。
硬件设计(略,参见配套硬件原理图)
软件设计
新建工程
复制一份 “07 SCI_UART_Recv_send” 修改文件夹名 “32 TSN_innerTemp”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 tsn.c 和 tsn.h 保存到目录下的 \src 文件夹下。
FSP 配置
Keil 界面选择 “Tools”→“RA Smart Configurator” 打开 RASC 界面。
添加 ADC Stack 模块。

配置 ADC Stack 参数。
Module→Input→Channel Scan Mask,勾选 “Temperature Sensor”,


在 “RA6M5 Group User's Manual: Hardware” 手册 45 章温度计算说明。

配置完成之后可以按下快捷键"Ctrl + S"保存,最后点击 "Generate Project Content" 按钮,让软件自动生成配置代码即可。
程序设计
初始化 ADC 模块,在循环中读取内部温度通道的 ADC 值,结合手册公式换算成温度值并打印到串口。
程序编写
tsn.h 头文件定义初始化和读取函数。
#ifndef __BSP_TSN_H
#define __BSP_TSN_H
#include "hal_data.h"
void tsn_Init(void);
void read_tsn_value(void);
#endif
tsn.c 中实现初始化 ADC,读取内部温度 ADC 值并换算。
#include "tsn.h"
//ADC转换完成标志位
volatile bool scan_complete_flag = false;
//ADC转换完成中断
void tsn_callback(adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
scan_complete_flag = true;
}
//ADC初始化
void tsn_Init(void)
{
fsp_err_t err;
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
}
//读取ADC数据并转换结果
void read_tsn_value(void)
{
uint16_t adc_data;
int32_t cal127;
adc_info_t adc_info;
(void)R_ADC_ScanStart(&g_adc0_ctrl);
while (!scan_complete_flag) //等待转换完成标志
{
;
}
scan_complete_flag = false; //重新清除标志位
// 读取通道0数据
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &adc_data);
R_ADC_InfoGet(&g_adc0_ctrl, &adc_info);
cal127 = (int32_t) adc_info.calibration_data;
double slope = 4.0/1000;
double v1= 3.3 * cal127 / 4096;
double vs = 3.3 * adc_data /4096;
double temperature = (vs - v1) / slope + 127;
printf("CPU Temperature: %.1f\r\n", temperature);
}
在 hal_entry.c 文件中包含 tsn.h,循环中每秒读取温度值。
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init(); // LED 初始化
uart0_Init();
tsn_Init();
printf("start tsn test\r\n");
while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
read_tsn_value();
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。
可以看到每秒打印温度值。
