779|2

426

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【芯海传感器信号调理CDS8712开发板】之三 范例代码结合ISP功能分析 [复制链接]

 

1. 经过1周的逐个范例代码分析,并对照数据表的内存分配,范例程序中的GPIO和UART等代码都是完整和一致的。

以下述GPIO代码精简后如下,


#include "cds871x_gpio.h"
#include "delay.h"


#define  VDD_VALUE                    3300U  /*!< Value of VDD in mv */       

gpio_config_t ptr_config;

int main(void)
{
    delay_init();

    rcc_ahb_periph_clock_enable_ctrl(RCC_AHBPeriph_GPIOA, ENABLE);   
    ptr_config.mode = GPIO_MODE_OUT_PP;
    ptr_config.pin = GPIO_PIN_1;
    ptr_config.pull = GPIO_PULL_UP;
    gpio_init(GPIO_GROUP_A,&ptr_config);		

    while(1)
    {
        gpio_bit_write(GPIO_GROUP_A,GPIO_PIN_NUM1,BIT_SET);
        delay_ms(500);
        gpio_bit_write(GPIO_GROUP_A,GPIO_PIN_NUM1,BIT_RESET);
        delay_ms(500);

	}
}

上述代码就是引用HAL库中的参数先定义引脚功能,再启动时钟延时控制,实现对于PA1的输出控制。

部分GPIO的HAL控制如下,

{
    GPIO_MODE_IN   		= 0x00,  		//!< GPIO Input mode            
    GPIO_MODE_OUT_PP  	= 0x01,  		//!< GPIO Output Push-pull mode, only avalaible for GPIOB             
    GPIO_MODE_OUT_OD    = 0x03,  		//!< GPIO Output Open-drain mode 
    GPIO_MODE_AN        = 0x04   		//!< GPIO Analog mode      
}gpio_mode_t;

#define GPIO_MODE_CHECK(flag) 			(((flag) == GPIO_MODE_IN)  || \
                               			((flag) == GPIO_MODE_OUT_PP) || \
                               			((flag) == GPIO_MODE_OUT_OD)     || \
                               			((flag) == GPIO_MODE_AN))
                            
/** 
  * @brief  gpio pull up selection
  */ 
typedef enum
{
    GPIO_PULL_NO_PULL = 0x00,			//!< No PullUp/PullDown config
    GPIO_PULL_UP      = 0x01, 			//!< GPIO PullUp config, only available for GPIOB
}gpio_pull_t;

#define GPIO_PULL_CHECK(flag) 			(((flag) == GPIO_PULL_NO_PULL) || \
                               			((flag) == GPIO_PULL_UP))

/**
  * @struct  gpio_config_t
  * @brief GPIO Init structure definition  
  */
typedef struct
{
    uint16_t         pin;        		//!< Specifies the GPIO pins to be configured                                       
    gpio_mode_t		mode;       		//!< Specifies the operating mode for the selected pins
    gpio_pull_t		pull;	   			//!< Specifies the pull up 
}gpio_config_t;

上述代码编译正确行下载成功后,并没有显示出GPIO的控制效果,类似的UART的输出也没有在串口控制器有任何显示。

如果使用逻辑分析仪就会更清楚,上述引脚完全没有输出。

2、经过对照说明,是ISP的设置有出入。具体如下,

      CDS871x 内嵌片上 FLASH,包括 60KB 应用程序内存(APROM)和 4KB 在系统编程 (ISP) 空间
(LDROM),可以通过 ISP 更新。当芯片焊到 PCB 板子上以后,In System Programming (ISP) 功能使用
户能更新应用程序内存。芯片上电以后,CPU 从 APROM 还是 LDROM 取代码运行,取决于用户配置
区 Config0 中启动选项(CBS)的设置。  
      FLASH 存储器控制器由从机接口,ISP 控制逻辑,烧写器接口和 FLASH 宏接口时序控制逻辑组成。
FLASH 存储器控制器框图如下所示(以下是 CPU 读取指令的地址编码及寻找范围)。

现在的代码并没有从APPROM启动,所以正确下载到ROM的代码没有执行。

3、ISP是有CONFIG设置存储器确定的,范例工程中地址如下

数据表中的地址如下
CDS871x 提供在系统编程 (ISP) 特性,允许用户直接更新 PCB 板上芯片中的程序,提供 4KB 程序
存储区专门用于存储 ISP 固件。用户设置 CONFIG0 的(CBS)选择系统上电后从 APROM 启动还是
LDROM 启动。用户配置区都是写保护(ISP 可读,CFGUEN=1 时可写擦除)。

这个在是否ISP写入,出厂配置数值这里并没有找到对应的说明。如果修改,需要先进入ISP模式。

4. 这个部分初步分析是否正确,提出想法一起尝试讨论,看是否可以进一步了解ISP的执行方法和机制。然后才能去进入GPIO等引脚功能的测试。

 

 

 

最新回复

---------------------------------------------------------------------------------------------------------- #define FIRMWARE_BOOT_ENABLE                         0 #define JLINK_DEBUG_ENABLE                                1 #define FIRMWARE_UPDATE_ENABLE                     2 #define FIRMWARE_UPDATE_OK_FLAG                   3     #define FW_BOOT_MODE                            JLINK_DEBUG_ENABLE #if FW_BOOT_MODE==FIRMWARE_BOOT_ENABLE #elif FW_BOOT_MODE==JLINK_DEBUG_ENABLE const unsigned int CONFIG0 __at(0x00300000) = 0x0001FFFE; //WDT(disabled),Delay(500us),APROM,IAP(disabled) const unsigned int CONFIG1 __at(0x00300004) = 0x1FFFE000;  //data flash 4k #elif FW_BOOT_MODE==FIRMWARE_UPDATE_ENABLE const unsigned int CONFIG0 __at(0x00300000) = 0x0009FFF6; //WDT(disabled),Delay(500us),LDROM,IAP(disabled) const unsigned int CONFIG1 __at(0x00300004) = 0x1FFFE000;  //data flash 4k #elif FW_BOOT_MODE==FIRMWARE_UPDATE_OK_FLAG const unsigned int UPDATE_OK_FLAG __at(0x0000EE00) = 0x6E727562;   #endif ---------------------------------------------------------------------------------------------------------- 可以把上述代码放到工程里面,通过选择不同的宏定义来选择芯片启动模式 例如:#define FW_BOOT_MODE                            JLINK_DEBUG_ENABLE 就是定义芯片直接从AP区启动 例如:#define FW_BOOT_MODE                            FIRMWARE_UPDATE_OK_FLAG 就是定义芯片从bootloader区启动,并写入AP区固件OK标记,这样芯片就可以正常从boot跳转到ap了 因为芯片从boot启动后会去判断EE00的绝对地址是否有代表固件OK标记的序列号,如果没有,则会一直等待升级命令。如果有就会自动跳转   详情 回复 发表于 2024-1-16 16:45
点赞 关注
 
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

----------------------------------------------------------------------------------------------------------

#define FIRMWARE_BOOT_ENABLE                         0
#define JLINK_DEBUG_ENABLE                                1
#define FIRMWARE_UPDATE_ENABLE                     2
#define FIRMWARE_UPDATE_OK_FLAG                   3    

#define FW_BOOT_MODE                            JLINK_DEBUG_ENABLE

#if FW_BOOT_MODE==FIRMWARE_BOOT_ENABLE

#elif FW_BOOT_MODE==JLINK_DEBUG_ENABLE
const unsigned int CONFIG0 __at(0x00300000) = 0x0001FFFE; //WDT(disabled),Delay(500us),APROM,IAP(disabled)
const unsigned int CONFIG1 __at(0x00300004) = 0x1FFFE000;  //data flash 4k
#elif FW_BOOT_MODE==FIRMWARE_UPDATE_ENABLE
const unsigned int CONFIG0 __at(0x00300000) = 0x0009FFF6; //WDT(disabled),Delay(500us),LDROM,IAP(disabled)
const unsigned int CONFIG1 __at(0x00300004) = 0x1FFFE000;  //data flash 4k
#elif FW_BOOT_MODE==FIRMWARE_UPDATE_OK_FLAG
const unsigned int UPDATE_OK_FLAG __at(0x0000EE00) = 0x6E727562;  
#endif

----------------------------------------------------------------------------------------------------------

可以把上述代码放到工程里面,通过选择不同的宏定义来选择芯片启动模式

例如:#define FW_BOOT_MODE                            JLINK_DEBUG_ENABLE

就是定义芯片直接从AP区启动

例如:#define FW_BOOT_MODE                            FIRMWARE_UPDATE_OK_FLAG

就是定义芯片从bootloader区启动,并写入AP区固件OK标记,这样芯片就可以正常从boot跳转到ap了

因为芯片从boot启动后会去判断EE00的绝对地址是否有代表固件OK标记的序列号,如果没有,则会一直等待升级命令。如果有就会自动跳转

点评

谢谢,我试一下  详情 回复 发表于 2024-1-17 09:05
 
 
 

回复

426

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
pengyi2010 发表于 2024-1-16 16:45 ---------------------------------------------------------------------------------------------------- ...

谢谢,我试一下

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表