PSOC Creator 入门教程超详细

PSOC Creator 入门教程超详细最近工作原因需要使用到赛普拉斯的一款芯片 奈何以前没有用过 所以趁这次也学习了一些简单的用法 总结一下 希望能帮到有需要朋友 因为网上关于这方面的文章少的可怜 详细点的更是少之又少 废话少说 正文开始 目录 1 PSOC Creator 工程创建 2 PSOC

大家好,我是讯享网,很高兴认识大家。

最近工作原因需要使用到赛普拉斯的一款芯片,奈何以前没有用过,所以趁这次也学习了一些简单的用法,总结一下,希望能帮到有需要朋友,因为网上关于这方面的文章少的可怜,详细点的更是少之又少!废话少说,正文开始.

目录

1. PSOC Creator工程创建

2. PSOC Creator简单控件配置

LED配置

按键控件配置

EZI2C控件配置

定时器控件配置与使用


1. PSOC Creator工程创建

点击左上角 File > New > Project 后出现图1,根据实际芯片选择对应型号,点击 Next

 
讯享网

 

选择创建一个空的原理图工程,Next

选择工作空间和工程存放路径,点击 Finish

工程创建完成后,如图4,出现一个空白的原理图类似的界面,还没结束,选中左边工程名,我的是Design01,点击右键选择 Device Selector

根据实际使用芯片选中对应型号,这个一定要对应!!如果找不到对应的型号,可能是在第一步的时候没有选对系列,是PSOC 4000S还是其他的,要查下自己对应的是哪款系列,选完后点击OK

双击Design Wide Resources 出现如图6的对应芯片界面,这个跟你实际的芯片管脚都是对应的,之后的配置也是围绕这个展开的,至此,工程创建才算真正完成,可以先Build一下工程看下有没有错误,右键工程名选择

点击这个图标只会编译当前正在使用的工程,例如下面加黑加粗的工程名就代表正在使用的工程,可以右键设置哪个工程为活动工程,或者直接右键想要编译的工程即可。当然,如果你的工作目录只有一个工程,默认就是编译仅有的工程。

2. PSOC Creator简单控件配置

LED配置

(1)双击工程左边列表上的TopDesign.cysch,出现对应界面,把Digital Output Pin拖到空白原理图任意位置,每一个pin就代表对应要输出电平的引脚,当前目的用来控制LED高低电平,因此,命名为对应的LED

(2)双击对应控件,进行配置,去掉HW connection的勾选,即代表不根据硬件连接直接控制引脚电平,使用芯片输出电平控制引脚,初始化为高电平(我的LED是低电平亮,这里初始不亮,看个人情况),其他配置默认即可,点击OK,其他LED配置同理

(3)先编译一次,再双击Design Wide Resources ,将LED的端口根据实际电路图进行配置,一定要一一对应才能正常控制对应的LED,可以直接拖动右边的对应行到芯片的对应管脚上,或者选择Port的那一列的下拉框进行选择,配置完成后再次编译

(4)编译完成后,会自动生成对应代码,注意:只有存在的控件且配置了才会生成相应代码,我这里显示这么多是因为有其他控件

(5)点击main.c编辑

/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "main.h" #include "led.h" #define LED_ON 0 #define LED_OFF 1 void LedOff(void) { LED_1_Write(LED_OFF); LED_2_Write(LED_OFF); LED_3_Write(LED_OFF); LED_4_Write(LED_OFF); } void LedOn(void) { LED_1_Write(LED_ON); LED_2_Write(LED_ON); LED_3_Write(LED_ON); LED_4_Write(LED_ON); } int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ for(;;) { //两秒亮灭一次 LedOn(); CyDelay(2000); LedOff(); CyDelay(2000); } } /* [] END OF FILE */

讯享网

按键控件配置

(1)双击工程左边列表上的TopDesign.cysch,出现对应界面,拖动CapSense按键控件到原理图上,双击控件,进行配置

(2)点击下图所示 “+” 进行添加按键(即一个控件里可以添加多个具体的按键),尽量选择手动调节Manual tuning模式,还有其他按键类型可选,这里我只使用了button类型按键

(3)后续如果需要调节按键灵敏度可以在 Advanced > Widget Details,调节手指阈值和噪声阈值,验证这两个值越小按键越灵敏,扫描分辨率这个参数目前没有动,也是可以调整的

(4)跟配置LED一样,先编译一次,再双击Design Wide Resources,根据实际原理图配置按键对应管脚即可,这里的Cmod实际是连接了一个电容,也是必须要选中对应管脚的,可以直接拖动右边的对应行到芯片的对应管脚上,或者选择Port的那一列的下拉框进行选择,配置完成后再次编译

(5)编译完成后,会自动生成对应代码

(6)去到main.c编辑代码

讯享网/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "main.h" #include "led.h" #define LED_ON 0 #define LED_OFF 1 void LedOn(void) { if(data&0x01) { LED_1_Write(LED_ON); } if(data&0x02) { LED_2_Write(LED_ON); } if(data&0x04) { LED_3_Write(LED_ON); } if(data&0x08) { LED_4_Write(LED_ON); } } void LedOff(void) { LED_1_Write(LED_OFF); LED_2_Write(LED_OFF); LED_3_Write(LED_OFF); LED_4_Write(LED_OFF); } int main(void) { volatile uint16 KeyStatus = 0; CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ //按键模块初始化 CapSense_Start(); CapSense_InitializeAllBaselines(); CapSense_ScanAllWidgets(); for(;;) { //读取按键值 if( CapSense_NOT_BUSY == CapSense_IsBusy()) { CapSense_ProcessAllWidgets(); //获取所有按键的状态 KeyStatus = CapSense_IsAnyWidgetActive(); //有按键按下就点亮对应LED,松开熄灭 if(KeyStatus) { //根据实际情况点灯即可 LedOn(KeyStatus); } else { LedOff(); } /* Transmits all CapSense values to the tuner */ CapSense_RunTuner(); CapSense_ScanAllWidgets(); } } } /* [] END OF FILE */

EZI2C控件配置

(1)双击工程左边列表上的TopDesign.cysch,出现对应界面,拖动EZI2C Slave到原理图上,双击组件进行配置

(2)I2C通信最主要的就是从机地址,再者就是跟主机的数据传输速率也要匹配上,当前设置的从机地址默认是0x08,也可以根据自身情况进行修改,但需要注意的这里配置的地址是7bit的,没有包括读写位,所以主机端通信使用的从机地址应该是0x08左移一位,即0x10才是完整的I2C从机地址,其他配置默认即可,点击OK

(3) 配置完成后,先编译,如下图生成相关EZI2C代码

(4)双击Design Wide Resources,根据实际原理图配置SCL/SDA对应管脚即可,配置完成后再次编译

(5)到main.c配置EZI2C代码实现主从机通信,主要是使用EZI2C_EzI2CSetBuffer1接口实现EzI2C缓冲区的映射,可以理解为是一个数组,从机往这个数组写入数据,主机通过I2C通信读取数据,所以读写的数组下标必须是一一对应的,才能读到对应写入的数据

 实现代码如下:

/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "main.h" #include "led.h" #define EZI2C_BUFSIZE 50 #define BTN0_FEEDBACK_REG_ADDR 0x00 #define BTN1_FEEDBACK_REG_ADDR 0x01 volatile uint8 aru8EzI2CBuf[EZI2C_BUFSIZE] = {0}; int main(void) { volatile uint16 KeyStatus = 0; CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ //初始化EZI2C控件 EZI2C_Start(); EZI2C_EzI2CSetBuffer1(sizeof(aru8EzI2CBuf), sizeof(aru8EzI2CBuf), aru8EzI2CBuf); CapSense_Start(); CapSense_InitializeAllBaselines(); CapSense_ScanAllWidgets(); for(;;) { //读取按键值更新到aru8EzI2CBuf if( CapSense_NOT_BUSY == CapSense_IsBusy()) { CapSense_ProcessAllWidgets(); KeyStatus = CapSense_IsAnyWidgetActive(); if(KeyStatus & 0x0FFF) { aru8EzI2CBuf[BTN0_FEEDBACK_REG_ADDR] = (KeyStatus & 0x00FF);//take 0-7 bit button aru8EzI2CBuf[BTN1_FEEDBACK_REG_ADDR] = (((KeyStatus >> 8) & 0x00FF) & 0x0F);//take 8-11 bit button } else { aru8EzI2CBuf[BTN0_FEEDBACK_REG_ADDR] = 0; aru8EzI2CBuf[BTN1_FEEDBACK_REG_ADDR] = 0; } } } } /* [] END OF FILE */

EZI2C相关接口说明

定时器控件配置与使用

目的:使用定时器中断计数模拟PWM控制LED亮度

(1)拖动Timer Counter(TCPWM mod)组件到原理图,双击组件,配置如下图,period参数我这里配置为299,意味着一个周期定时器最大计数到299,之后又从0开始计数

(2)定时器需要提供一个时钟,配置时钟频率和定时器最大周期计数,可控制定时器中断的频率

(3)添加定时器中断控件,连接到定时器的中断上,可以拖动到跟定时器interrupt引出线的重合上,或者点快捷键 “w” 直接连线

 

 

按照以上配置,进入中断1次的时间间隔为0.1ms,3M / (299+1) = 10KHz,1KHz = 1ms,T=1 / f ,即0.1ms,这里我们可以按照进入中断次数设定一个PWM的完整周期时长,这里目的是用来控制LED亮度,所以设定的PWM周期一般要 <= 10ms,为啥呢,因为在100Hz左右人眼看不到LED灯是否在闪烁了,即10ms左右led闪烁一次是看不出来的,通常设定10ms为一个PWM周期,改变占空比来达到控制灯的亮度。占空比就是一个周期内有效电平占整个周期的比值,比如想设置80%的亮度,那么在10ms内,8ms需要点亮LED,2ms熄灭即可,其他亮度也是类似,代码实现如下:

main.c

讯享网/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "main.h" #include "led.h" uint32 pwm_cnt = 0; uint32 Cycle_PWM = 100; uint8 PWM_EN = 1; void SetPwmCompare(uint16 u16PwmDuty) { //改为自己需要点亮的灯即可 uint16 u16LedStatus = GetLedStatus(); if((u16LedStatus & 0x0FFF) && (u16PwmDuty > 0)) { PWM_EN = 1; //先点亮LED,占空比设置开始 if( pwm_cnt == 1) { LedOn(u16LedStatus); } //pwm中断计数跟设定的占空比或者说亮度值相等,熄灭LED else if(pwm_cnt == (u16PwmDuty + 1)) { LedOff(); } //pwm计数达到一个周期后从0开始 else if(pwm_cnt > Cycle_PWM) { pwm_cnt = 0; } } else { PWM_EN = 0; LedOff(); } } int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ //定时器初始化 Timer_INT_StartEx(Timer_INT_Interrupt); Timer_1_Start(); for(;;) { } } /* [] END OF FILE */

Timer_INT.c(根据你的中断控件名字生成的c文件)找到中断入口函数,添加LED控制亮度操作

CY_ISR(Timer_INT_Interrupt) { #ifdef Timer_INT_INTERRUPT_INTERRUPT_CALLBACK Timer_INT_Interrupt_InterruptCallback(); #endif /* Timer_INT_INTERRUPT_INTERRUPT_CALLBACK */ /* Place your Interrupt code here. */ /* `#START Timer_INT_Interrupt` */ //在这个位置放入你的代码,否则每次编译都会被还原 if(PWM_EN) { pwm_cnt++; } else { pwm_cnt=0; } //传入想要修改的亮度值,根据10ms内进入中断的最大次数设置对应值 //例如:0.1ms进一次中断,PWM周期为10ms就是100次,即亮度可调值为0-100 SetPwmCompare(GetBrightnessVal()); //必须要加上清除中断计数操作 Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC); /* `#END` */ }

小讯
上一篇 2025-02-17 23:42
下一篇 2025-02-26 09:15

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/19292.html