本帖最后由 forgot 于 2023-12-23 22:34 编辑
#有奖活动# #申请原创# 我是第一次接触杰发科技的MCU,所以拿到板子之后首先是到官网对应的下载相关的技术资料,并根据资料说明在MDK下面添加相关pack,相关文件和说明还是非常的齐全的。
按照官方提供的demo例程跑了几个简单的程序之后,因为手上正好有个OLED液晶模块,所以准备做一个OLED驱动显示ADC外设数据采样,因为有一个ac7840x_freertos的工程包,就顺便在freertos系统上跑了。
工程添加的相关文件, ADC相关: adc_sample.c、adc_sample.h 这个是在ADC中找到的,因为板子上有两个电位器可以调节,选择的软件触发采样,配置采集板子上两个电位器的电压,同时一路采集内部温度传感器通道电压,另一路采集内部供电电压通道。
Oled相关: oled.c、oled.h、oledfont.h 采用的IO模拟I2C时序来实现显示的,对应的管脚是PC14、PC15、PC16。
看门狗相关: wdg_basic.c、wdg_basic.h 采用的是独立看门狗,没有用窗口看门狗。
创建3个系统任务: /* 开始任务函数 */
void start_task(void *pvParameters)
{
BaseType_t xReturn = pdPASS; /* 定义一个创建信息返回值,默认为pdPASS */
taskENTER_CRITICAL(); /* 进入临界区 */
/* 创建OLED_Task任务 */
xReturn = xTaskCreate((TaskFunction_t)OLED_Task,
(const char*)"OLED_Task",
(configSTACK_DEPTH_TYPE)256,
(void*)NULL,
(UBaseType_t)17,
(TaskHandle_t*)&OLED_Task_Handler);
if (pdPASS == xReturn)
{
printf("OLED_Task was created successfully\r\n");
}else{
__NOP();
}
/* 创建ADC_Task任务 */
xReturn = xTaskCreate((TaskFunction_t)ADC_Task,
(const char*)"ADC_Task",
(configSTACK_DEPTH_TYPE)256,
(void*)NULL,
(UBaseType_t)16,
(TaskHandle_t*)&ADC_Task_Handler);
if (pdPASS == xReturn)
{
printf("ADC_Task was created successfully\r\n");
}else{
__NOP();
}
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
taskEXIT_CRITICAL(); /* 退出临界区 */
}</font>
在初始化中添加: MY_OLED_Init(); ADC_Init(); 保留原来的: GPIO_LedInit(); GPIO_KeyInit(); GPIO_LedInit();
GPIO_KeyInit();
GPIO_OledInit();
MY_OLED_Init();
ADC_Init();
WDG_Basic();
配置好任务相关的堆栈大小和调度相关的参数设置; /* Constants that describe the hardware and memory usage. */
#define configCPU_CLOCK_HZ AC7840X_CORE_CLOCK /* CPU频率 */
#define configTICK_RATE_HZ ((TickType_t)1000) /* 时钟节拍频率,这里设置为1000,周期就是1ms */
#define configTOTAL_HEAP_SIZE ((size_t)8192*2) /* 系统所有总的堆大小 */
#define configMINIMAL_STACK_SIZE ((uint16_t)128) /* 空闲任务使用的堆栈大小 */
#define configSUPPORT_DYNAMIC_ALLOCATION 1 /* 支持动态内存申请 */
#define configSUPPORT_STATIC_ALLOCATION 0 /* 静态内存申请 */
/* Constants related to the behaviour or the scheduler. */
#define configMAX_PRIORITIES 30 /* 可使用的最大优先级 */
#define configUSE_PREEMPTION 1 /* 1使用抢占式内核,0使用协程 */
#define configUSE_TIME_SLICING 1
#define configIDLE_SHOULD_YIELD 0
#define configMAX_TASK_NAME_LEN (20) /* 任务名字字符串长度 */
#define configUSE_16_BIT_TICKS 0 /* 系统节拍计数器变量数据类型 */
OLED_Task功能: LED3闪烁、OLED夜间显示开机字符和4路ADC的采样结果,采用的是十进制显示的; void Show_ADC(void)
{
int ret;
char s[4][10];
//show data
if(1){
OLED_Clear();
sprintf(&s[0][0],"V1:%d",(int)g_adc_array[0]);
sprintf(&s[1][0],"V2:%d",(int)g_adc_array[1]);
sprintf(&s[2][0],"TS:%d",(int)g_adc_array[2]);
sprintf(&s[3][0],"SP:%d",(int)g_adc_array[3]);
OLED_ShowString(0,0,(unsigned char *)"AC7840x_ADC",16);
OLED_ShowString(0,4,(unsigned char *)&s[0][0],16);
OLED_ShowString(70,4,(unsigned char *)&s[1][0],16);
OLED_ShowString(0,6,(unsigned char *)&s[2][0],16);
OLED_ShowString(70,6,(unsigned char *)&s[3][0],16);
}
}
//MY TEST 21ic:forgot
void MY_OLED_START(void)
{
int i;
static int power_on = 0;
char Line[4][20];
if(!power_on) {
power_on = 1;
memcpy(&Line[0][0],"Hello 21ic!",sizeof("Hello 21ic!"));
memcpy(&Line[1][0],"ID:forgot",sizeof("ID:forgot"));
memcpy(&Line[2][0],"AC7840x",sizeof("AC7840x"));
memcpy(&Line[3][0],"FreeRTOS_TEST",sizeof("FreeRTOS_TEST"));
OLED_Clear();
for(i = 0; i < 4; i++) {
OLED_ShowString(0,i*2,(unsigned char *)&Line[i][0],16);
}
vTaskDelay(2000);
}
Show_ADC();
}
ADC_Task功能: RGB闪烁、ADC规则组采集和喂狗,两路电位器分别接到芯片 ADC 的两个不同通道ADC0_IN10(PC2)和ADC0_IN11(PC3); void RGB_Toggle(void)
{
if (++g_flag > 8) {g_flag = 1;}
switch (g_flag)
{
case 1:
RGBLED_R_ON;
RGBLED_G_OFF;
RGBLED_B_OFF;
break;
case 2:
RGBLED_R_OFF;
RGBLED_G_ON;
RGBLED_B_OFF;
break;
case 3:
RGBLED_R_OFF;
RGBLED_G_OFF;
RGBLED_B_ON;
break;
case 4:
RGBLED_R_ON;
RGBLED_G_ON;
RGBLED_B_ON;
break;
case 5:
RGBLED_R_ON;
RGBLED_G_ON;
RGBLED_B_OFF;
break;
case 6:
RGBLED_R_ON;
RGBLED_G_OFF;
RGBLED_B_ON;
break;
case 7:
RGBLED_R_OFF;
RGBLED_G_ON;
RGBLED_B_ON;
break;
default:
RGBLED_R_OFF;
RGBLED_G_OFF;
RGBLED_B_OFF;
break;
}
}
void ADC_TriggerTest(void)
{
ADC_DRV_SoftwareStartRegularConvert(ADC_INDEX);
while (!ADC_DRV_GetConvCompleteFlag(ADC_INDEX, ADC_RSEQ_3));
ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_0, &g_adc_array[0]);
ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_1, &g_adc_array[1]);
ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_2, &g_adc_array[2]);
ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_3, &g_adc_array[3]);
printf("ADC_value: VR1 = 0x%-5x VR2 = 0x%-5x TSENSOR = 0x%-5x SUPPLY = 0x%-5x \r\n", g_adc_array[0], g_adc_array[1], g_adc_array[2], g_adc_array[3]);
}
实验效果:
总结: 虽然是第一次接触杰发科技的产品,但是对于杰发科技提供的技术支持是非常满意的,官网上的资料做的很好,开发非常好上手,关于外设模块的配置部分库文件的一些写法感觉要比其他的一些厂家要更简洁。
附件为完整的评测工程文件:
|