-
关于AC7801例程代码初始化外设没有看到开时钟操作 sos
[i=s] 本帖最后由 zx37992 于 2024-8-15 09:41 编辑 [/i] AC7801系列单片机GPIO例程中初始化GPIO为啥看不到打开外设时钟?例程代码如下:[img]file:///C:\Users\ADMINI~1\AppData\Local\Temp\QQ_1723685902993.png[/img]
1537浏览量 0回复量 关注量 -
APM32E103的FPU功能,寄存器操作成功过吗? sos
按照用户手册,的步骤,最终卡在第6步,FPU_ISTS 寄存器一直是busy。对于 SUM 、SUB 、PRDCT 、SUMSQ ,建议配置如下:1 - 配置 FPU_CTRL 寄存器,选择需要的模式, 2 - 在 nLEN 字段录入 n 的值, 3 - 设置起始(STR)位 4 - P0 操作数写入 FPU_FPI1 5 - P1..n-1 的操作数依次写入 FPU_FPI2 6 - 等待中断完成或者检查 FPU_ISTS 寄存器的完成(DONE)标志从 FPU_FPO 读取结果
1015浏览量 0回复量 关注量 -
引脚复用配置 sos
在配置GPIO_InitStructure.GPIO_Alternate属性的时候,有时候会看到类似[font=Droid Sans Mono, monospace, monospace][color=#5d5d5f]GPIO_AF2_TIM3或GPIO_AF4_TIM3。请问这里的AFx的x应该如何选择?[/color][/font]
799浏览量 0回复量 关注量 -
使用MCC的I2C, notification中出現了警告: sos
SPI MASTER...如下圖, 請問如何解決? Please add a confication to ensure proper functionality! 我沒有使用SPI阿? 我的芯片是dspic 33ck32mp102,
590浏览量 0回复量 关注量 -
apm32f003 iap在线升级 中断向量表 修改无效
已定义 #define __VTOR_PRESENT 1U /*!
VTOR = FMC_BASE | VECT_TAB_OFFSET; //此处修改了中断向量表偏移地址,但实际并未被修改 GPIO_Init(); TMR4Init(); //中断处理中对PB4进行翻转 while(1) { delay(500000); //GPIO_Toggle(GPIOB, GPIO_PIN_4); } return 0; } 1006浏览量 3回复量 关注量 -
为什么配置了tim0,LED灯都不闪了,也没有PWM输出。 sos
int main(void) { Clock_Init(); SystemInit(); Gpio_Init(); UTimer_Init(); //SoftDelay(); while(1){ GPIO_SetBits(GPIO0,GPIO_Pin_3); SoftDelay(1000000); GPIO_ResetBits(GPIO0,GPIO_Pin_3); SoftDelay(1000000); } } void UTimer_Init(void){ TIM_TimerInitTypeDef TIM_InitStruct; TIM_TimerStrutInit(&TIM_InitStruct); SYS_WR_PROTECT = 0x7a83; // 关闭写保护 SYS_CLK_FEN = BIT4;//Timer0时钟使能 SYS_WR_PROTECT = 0; //开启写保护 TIM_InitStruct.Timer_EN = ENABLE; TIM_InitStruct.Timer_CH0_WorkMode = TIMER_OPMode_CMP;//输出比较模式 TIM_InitStruct.Timer_CH0Output = 0;/**< Timer 通道0在比较模式下的输出极性控制,当计数器 CNT
859浏览量 0回复量 关注量 -
ch32v307用HC-SR04 超声波测距和MQ2 烟雾浓度时会卡死,大家帮我看看代码
[i=s] 本帖最后由 nmmdw 于 2024-7-4 12:58 编辑 [/i] s1.c文件//============================================================================ // HC-SR04 超声波测距模块============================================================== void ultrasonic_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init( GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); } u16 count = 0; void Input_Capture_Init( u16 arr, u16 psc ) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; //使能IM2时钟 RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE); ultrasonic_GPIO_Init(); TIM_DeInit(TIM2); //定时器周期,实际就是设定自动重载寄存器 ARR 的值, ARR 为要装载到实际自动重载寄存器(即影子寄存器) 的值, 可设置范围为 0 至 65535。 TIM_TimeBaseInitStructure.TIM_Period = arr; //定时器预分频器设置,时钟源经该预分频器才是定时器计数时钟CK_CNT,它设定 PSC 寄存器的值。 //计算公式为: 计数器时钟频率 (fCK_CNT) 等于fCK_PSC / (PSC[15:0] + 1),可实现 1 至 65536 分频。 TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //时钟分频,设置定时器时钟 CK_INT 频率与死区发生器以及数字滤波器采样时钟频率分频比。可以选择 1、 2、 4 分频。 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数模式,向上计数模式 //TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00; //设置重复计数器的值,0。重复计数器,只有 8 位,只存在于高级定时器。 TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure); //初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM1捕获比较中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道 NVIC_Init(&NVIC_InitStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE ); //使能TIM2更新中断 TIM_Cmd( TIM2, DISABLE ); //定时器使能 } void ENABLE_TIM(void) { //while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==RESET) { TIM_SetCounter(TIM2,0); count = 0; TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数 } } void DISABLE_TIM(void) { //while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==SET) { TIM_Cmd(TIM2,DISABLE);//回响信号到来,开启定时器计数 } } u32 GetCount(void) { u32 t = 0; t = count*1000; t += TIM_GetCounter(TIM2); TIM_SetCounter(TIM2,0); Delay_Ms(10); return t; } //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号 //为了消除余震的影响,取五次数据的平均值进行加权滤波。 float Ultrasoniclength(void ) { // MQ2_run(); // Delay_Ms(2000); u32 t = 0; int i = 0; float length = 0 , sum = 0; while(i!=5) { Trig_H; Delay_Us(20); Trig_L; while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==RESET); //此处一直等,等到为1,进行下一步 ENABLE_TIM();//回响信号到来,开启定时器计数 i++; while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==SET); //此处一直等,等到为0,进行下一步,这两段while之间的时间就是高电平时间,即发出到返回接收的时间 DISABLE_TIM();//回响信号到来,开启定时器计数 t = TIM_GetCounter(TIM2); length=(t+count*1000)/58.0;//通过回响信号计算距离 sum = length + sum ; TIM_SetCounter(TIM2,0); count = 0; Delay_Ms(100); } length = sum/5.0; return length; } void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志 count++; } } //============================================================================= // MQ2 烟雾浓度模块============================================================ u8 times; void MQ2_Init() { GPIO_InitTypeDef GPIO_Initstructre; ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd(MQ2_RCC_GPIOx | MQ2_RCC_ADCx,ENABLE); //PA1 作为模拟通道输入引脚 GPIO_Initstructre.GPIO_Mode=GPIO_Mode_AIN;//模拟输入引脚 GPIO_Initstructre.GPIO_Pin=MQ2_GPIOx_Pinx; GPIO_Initstructre.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstructre); GPIO_SetBits(MQ2_GPIOx,MQ2_GPIOx_Pinx); RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M ADC_DeInit(MQ2_ADCx);//复位ADC1 ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//模数转换工作在单次转换模式 ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐 ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动 ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStruct.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目 ADC_InitStruct.ADC_ScanConvMode = DISABLE;//模数转换工作在单通道模式 ADC_Init(MQ2_ADCx,&ADC_InitStruct);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 ADC_Cmd(MQ2_ADCx,ENABLE);//使能指定的ADC1 ADC_ResetCalibration(MQ2_ADCx);//使能复位校准 while(ADC_GetResetCalibrationStatus(MQ2_ADCx));//等待复位校准结束 ADC_StartCalibration(MQ2_ADCx);//开启AD校准 while(ADC_GetCalibrationStatus(MQ2_ADCx));//等待校准结束 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 } //获得ADC值 ch:通道值 0~3 u16 Get_Adc(u8 ch)//设置指定ADC的规则组通道,一个序列,采样时间 { ADC_RegularChannelConfig(MQ2_ADCx,ch,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(MQ2_ADCx,ENABLE);//使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(MQ2_ADCx,ADC_FLAG_EOC));//等待转换结束 return ADC_GetConversionValue(MQ2_ADCx);//返回最近一次ADC1规则组的转换结果 } u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val = 0; u8 t; for(t = 0;t < times;t++) { temp_val += Get_Adc(ch); Delay_Ms(5); } return temp_val / times; } float MQ2_Value;//adc值 float temp_one;//电压值 void MQ2_run() { MQ2_Value = Get_Adc_Average(ADC_Channel_1,10) * 100 / 4095;//模拟烟雾浓度的值 temp_one = (float) MQ2_Value / 4096*3.3; printf("烟雾浓度= %3.2f %,电压值=%3.2f\r\n",MQ2_Value,temp_one); Delay_Ms(1000); } //=========================================================================== s1.h文件====================================================================== #ifndef USER_S1_H_ #define USER_S1_H_ #include "ch32v30x_conf.h" // HC-SR04 超声波测距模块======================================================== #define Trig_H GPIO_SetBits(GPIOA,GPIO_Pin_0) #define Trig_L GPIO_ResetBits(GPIOA,GPIO_Pin_0) #define Echo_H GPIO_SetBits(GPIOA,GPIO_Pin_1) #define Echo_L GPIO_ResetBits(GPIOA,GPIO_Pin_1) void ultrasonic_GPIO_Init(void); void Start_Trig(void); void Input_Capture_Init( u16 arr, u16 psc ); void ENABLE_TIM(void); void DISABLE_TIM(void); u32 GetCount(void); float Ultrasoniclength(void); // MQ2 烟雾浓度模块============================================================= #define MQ2_GPIOx GPIOD //修改 A 时,GPIO 使能的 A 也要修改 #define MQ2_GPIOx_Pinx GPIO_Pin_3 //引脚 #define MQ2_RCC_GPIOx RCC_APB2Periph_GPIOD //GPIO 使能 #define MQ2_ADCx ADC1 //修改 1 时,ADC 使能的 1 也要修改 #define MQ2_RCC_ADCx RCC_APB2Periph_ADC1 //ADC 使能 void MQ2_Init(void); u16 Get_Adc(u8 ch); u16 Get_Adc_Average(u8 ch,u8 times); void MQ2_Check(void); void MQ2_run(void); #endif /* USER_S1_H_ */
2313浏览量 2回复量 关注量 -
沁恒ch32v307无法实现hc-sr04超声波测距,大家帮忙看看
//超声波测距模块============================================================== //system.c u16 count = 0; void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void ultrasonic_Init(u16 arr, u16 psc)//初始化 { //初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; //使能IM2时钟 RCC_APB1PeriphClockCmd(ultrasonic_RCC | RCC_APB1Periph_TIM2, ENABLE); //配置 GPIO_InitStructure.GPIO_Pin = ultrasonic_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ultrasonic_GPIOx, &GPIO_InitStructure); GPIO_ResetBits(ultrasonic_GPIOx, ultrasonic_Pin); GPIO_InitStructure.GPIO_Pin = ultrasonic_Pin_t; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(ultrasonic_GPIOx, &GPIO_InitStructure); GPIO_ResetBits(ultrasonic_GPIOx, ultrasonic_Pin | ultrasonic_Pin_t); TIM_DeInit(TIM2); //定时器周期,实际就是设定自动重载寄存器 ARR 的值, ARR 为要装载到实际自动重载寄存器(即影子寄存器) 的值, 可设置范围为 0 至 65535。 TIM_TimeBaseInitStructure.TIM_Period = arr; //定时器预分频器设置,时钟源经该预分频器才是定时器计数时钟CK_CNT,它设定 PSC 寄存器的值。 //计算公式为: 计数器时钟频率 (fCK_CNT) 等于fCK_PSC / (PSC[15:0] + 1),可实现 1 至 65536 分频。 TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //时钟分频,设置定时器时钟 CK_INT 频率与死区发生器以及数字滤波器采样时钟频率分频比。可以选择 1、 2、 4 分频。 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数模式,向上计数模式 //TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00; //设置重复计数器的值,0。重复计数器,只有 8 位,只存在于高级定时器。 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM1捕获比较中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道 NVIC_Init(&NVIC_InitStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE ); //使能TIM2更新中断 TIM_Cmd(TIM2, DISABLE ); //定时器使能 } void ENABLE_TIM(void) { //while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==RESET) { TIM_SetCounter(TIM2,0); count = 0; TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数 } } void DISABLE_TIM(void) { //while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==SET) { TIM_Cmd(TIM2,DISABLE);//回响信号到来,开启定时器计数 } } u32 GetCount(void) { u32 t = 0; t = count*1000; t += TIM_GetCounter(TIM2); TIM_SetCounter(TIM2,0); Delay_Ms(10); return t; } //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号 //为了消除余震的影响,取五次数据的平均值进行加权滤波。 float Ultrasonic_length(void ) { u32 t = 0; int i = 0; float length = 0 ,sum = 0; while(i!=5) { Trig_H; Delay_Us(20); Trig_L; while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==RESET); //此处一直等,等到为1,进行下一步 ENABLE_TIM();//回响信号到来,开启定时器计数 i = i + 1; while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==SET); //此处一直等,等到为0,进行下一步,这两段while之间的时间就是高电平时间,即发出到返回接收的时间 DISABLE_TIM();//回响信号到来,开启定时器计数 t = TIM_GetCounter(TIM2); length=(t+count*1000)/58.0;//通过回响信号计算距离 sum = length + sum; TIM_SetCounter(TIM2,0); count = 0; Delay_Ms(100); } length = sum/5.0; return length; } void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志 count++; } } //===================================================================== //system.h #ifndef __SYSTEM_H #define __SYSTEM_H #include "ch32v30x_conf.h" //超声波测距模块============================================================ #define ultrasonic_GPIOx GPIOA //修改 A 时,使能的 A 也要修改 #define ultrasonic_Pin GPIO_Pin_0 #define ultrasonic_Pin_t GPIO_Pin_1 #define ultrasonic_RCC RCC_APB2Periph_GPIOA //使能 #define Trig_H GPIO_SetBits(ultrasonic_GPIOx,GPIO_Pin_0) #define Trig_L GPIO_ResetBits(ultrasonic_GPIOx,GPIO_Pin_0) #define Echo_H GPIO_SetBits(ultrasonic_GPIOx,GPIO_Pin_1) #define Echo_L GPIO_ResetBits(ultrasonic_GPIOx,GPIO_Pin_1) void ultrasonic_Init( u16 arr, u16 psc ); void ENABLE_TIM(void); void DISABLE_TIM(void); u32 GetCount(void); float Ultrasonic_length(void); //========================================= //main.c #include "debug.h" #include "../General_file/system.h" #include "ch32v30x_usart.h" int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); SystemCoreClockUpdate(); Delay_Init(); USART_Printf_Init(115200);//115200 printf("SystemClk:%d\r\n",SystemCoreClock); printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID()); ultrasonic_Init(1000-1,72-1); float distance = 0; //cm while(1) { distance = Ultrasonic_length(); printf("距离:%3.2f cm\n",distance); Delay_Ms(1000); } } //串口打印如下================================================================== 距离: cm 距离: cm 距离: cm 距离: cm 距离: cm 距离: cm 距离: cm //救救孩子吧,不知道怎么改了
6020浏览量 18回复量 关注量 -
为什么AD5328没有输出电压
#ifndef __SPI1_H #define __SPI1_H #include "gd32f4xx.h" /* 时钟使能宏定义 */ #define SPIx SPI1 #define SPIx_CLK_ENABLE() rcu_periph_clock_enable(RCU_SPI1) #define SPIx_SCK_GPIO_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOB) #define SPIx_MISO_GPIO_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOB) #define SPIx_MOSI_GPIO_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOB) #define SPIx_CS_GPIO_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOB) #define LDAC_GPIO_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOB) /* SPIx 引脚定义 */ #define SPIx_SCK_PIN GPIO_PIN_13 #define SPIx_SCK_GPIO_PORT GPIOB #define SPIx_MOSI_PIN GPIO_PIN_15 #define SPIx_MOSI_GPIO_PORT GPIOB #define AD5328_CS_PIN GPIO_PIN_12 #define AD5328_CS_GPIO_PORT GPIOB // AD5328 的 LDAC 引脚 #define AD5328_LDAC_PIN GPIO_PIN_14 #define AD5328_LDAC_GPIO_PORT GPIOB #define AD5328_LDAC_PIN GPIO_PIN_14 #define AD5328_LDAC_GPIO_PORT GPIOB #define digitalHi(p,i) {gpio_bit_set(p, i);} // 设置为高电平 #define digitalLo(p,i) {gpio_bit_reset(p, i);} // 设置为低电平 #define SPI_AD5328_CS_LOW() digitalLo(AD5328_CS_GPIO_PORT, AD5328_CS_PIN) #define SPI_AD5328_CS_HIGH() digitalHi(AD5328_CS_GPIO_PORT, AD5328_CS_PIN) #define AD5328_LDAC_LOW() digitalLo(AD5328_LDAC_GPIO_PORT, AD5328_LDAC_PIN) #define AD5328_LDAC_HIGH() digitalHi(AD5328_LDAC_GPIO_PORT, AD5328_LDAC_PIN) void SPI1_Init(void);//SPI1初始化 void Write_Byte(unsigned int Data);//SPI1写数据 void SPI1_Write_Data(unsigned char Channel,unsigned int Tdata);//写数据 void AD5328_Init(); //AD5328初始化 void SPWM_Out_DAValue(unsigned char Channel,unsigned int Dim_Vlaue); #endif /* __SPI1_H */ #include "gd32f4xx.h" #include "main.h" #include "systick.h" unsigned int RST = 0xE000; unsigned int Buff_SET = 0x8000; unsigned int POWER_DOWN = 0xC000; unsigned int LOCK_MODE_Updata = 0xA001; void AD5328_Init(void)//AD5328初始化 { Write_Byte(RST);//复位芯片 delay_1ms(1);//延时1ms Write_Byte(Buff_SET); //设置缓冲模式 Write_Byte(POWER_DOWN);//关闭功耗模式 Write_Byte(LOCK_MODE_Updata);//单次更新模式 } void SPI1_Init(void)//SPI1初始化 { spi_parameter_struct spi_init_struct;//SPI参数结构体 /* 使能外设和GPIO时钟 */ SPIx_SCK_GPIO_CLK_ENABLE(); SPIx_MOSI_GPIO_CLK_ENABLE(); SPIx_CS_GPIO_CLK_ENABLE(); SPIx_CLK_ENABLE(); LDAC_GPIO_CLK_ENABLE(); /* 配置 SPI SCK GPIO 引脚 */ gpio_mode_set(SPIx_SCK_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, SPIx_SCK_PIN); gpio_output_options_set(SPIx_SCK_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SPIx_SCK_PIN); gpio_af_set(SPIx_SCK_GPIO_PORT, GPIO_AF_5, SPIx_SCK_PIN); // 设置为 AF5 用于 SPI1 /* 配置 SPI MOSI GPIO 引脚 */ gpio_mode_set(SPIx_MOSI_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, SPIx_MOSI_PIN); gpio_output_options_set(SPIx_MOSI_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SPIx_MOSI_PIN); gpio_af_set(SPIx_MOSI_GPIO_PORT, GPIO_AF_5, SPIx_MOSI_PIN); // 设置为 AF5 用于 SPI1 /* 配置 CS 引脚 */ gpio_mode_set(AD5328_CS_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, AD5328_CS_PIN); gpio_output_options_set(AD5328_CS_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, AD5328_CS_PIN); //gpio_af_set(AD5328_CS_GPIO_PORT, GPIO_AF_5, AD5328_CS_PIN); // 设置为 AF5 用于 SPI1 /* 配置 LDAC 引脚 */ gpio_mode_set(AD5328_LDAC_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, AD5328_LDAC_PIN); gpio_output_options_set(AD5328_LDAC_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, AD5328_LDAC_PIN); /* SPI 配置 */ spi_init_struct.trans_mode = SPI_TRANSMODE_BDTRANSMIT;//半双工模式 spi_init_struct.device_mode = SPI_MASTER;//主机模式 spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;//8位帧 spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;//时钟极性低,第二个边沿采样 spi_init_struct.nss = SPI_NSS_SOFT;//软件控制NSS spi_init_struct.prescale = SPI_PSC_4;//预分频256 spi_init_struct.endian = SPI_ENDIAN_MSB;//高位在前 spi_init(SPIx, &spi_init_struct); // spi_bidirectional_line_config() spi_enable(SPIx); } unsigned char SPI_Buff[4] = {0}; void Write_Byte(unsigned int Data)//SPI1写数据 { SPI_AD5328_CS_LOW();//NSS拉低 SPI_Buff[0] = (unsigned char)(Data>>8); //高位 SPI_Buff[1] = (unsigned char)(Data);//低位 while (RESET == spi_i2s_flag_get(SPIx, SPI_FLAG_TBE));// 等待发送缓冲区空闲 spi_i2s_data_transmit(SPIx, SPI_Buff[0]); while (RESET == spi_i2s_flag_get(SPIx, SPI_FLAG_TBE));// 等待发送缓冲区空闲 spi_i2s_data_transmit(SPIx, SPI_Buff[1]); SPI_AD5328_CS_HIGH();//NSS拉高 } unsigned int sdata =0; void SPI1_Write_Data(unsigned char Channel,unsigned int Tdata)//写入数据 { SPI_AD5328_CS_LOW();//NSS拉低 sdata = (Channel<<12) | (Tdata & 0x0FFF);//设置数据位 sdata = sdata & 0x7FFF;//去掉最高位的1 SPI_Buff[0] = (unsigned char)(sdata>>8); //高位 SPI_Buff[1] = (unsigned char)(sdata);//低位 while (RESET == spi_i2s_flag_get(SPIx, SPI_FLAG_TBE));//等待空闲位 spi_i2s_data_transmit(SPIx, SPI_Buff[0]); while (RESET == spi_i2s_flag_get(SPIx, SPI_FLAG_TBE));//等待空闲位 spi_i2s_data_transmit(SPIx, SPI_Buff[1]); SPI_AD5328_CS_HIGH();//NSS拉高 } unsigned int REF_AD_Value = 0;//AD采样值 unsigned int DA_Value = 0;//DAC输出值 double FDA_Value = 0;//DAC输出值(浮点数) ///////////////////////////////// //Channel:通道选择,0~7 //Dim_Vlaue:亮度值,0~5000 //////////////////////////////// void SPWM_Out_DAValue(unsigned char Channel,unsigned int Dim_Vlaue)//SPWM输出DAC值 { if(Dim_Vlaue <= 4998)//0-5V { FDA_Value = (double)Dim_Vlaue/5000;//DAC输出值(浮点数) DA_Value = FDA_Value*4096;//DAC输出值(整数) }else { DA_Value = 4095;//最大值 } SPI1_Write_Data(Channel,Dim_Vlaue);//写入数据 }
1930浏览量 1回复量 关注量 -
HC32L136K8TA,低功耗
[color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]目前使用的是gpio的低功耗例程,在HC32L136K8TA最小开发板上测试功耗始终降不下去,查看过寄存器bgr和adc这些外设都已关闭,我达不到10ua以内,最小只可以达到369ua,求指导一下还该咋样配置代码:[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]int32_t main(void)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]{[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] delay1ms(5000);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ///< 配置Demo板上所有不使用的IO为高阻输入,避免端口漏电[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] App_LowPowerModeGpioSet();[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ///< 进入低功耗模式——深度休眠(使能唤醒后退出中断自动休眠特性)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] Lpm_GotoDeepSleep(TRUE);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] while(1)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]}[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]static void App_LowPowerModeGpioSet(void)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]{[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ///< 打开GPIO外设时钟门控[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] //swd as gpio[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] Sysctrl_SetFunc(SysctrlSWDUseIOEn, TRUE);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ///< 配置为数字端口[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PAADS = 0;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PBADS = 0;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PCADS = 0;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PDADS = 0;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ///< 配置为端口输入[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PADIR = 0XFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PBDIR = 0XFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PCDIR = 0XFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PDDIR = 0XFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] ///< 输入上拉[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PAPD = 0xFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PBPD = 0xFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PCPD = 0xFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] M0P_GPIO->PDPD = 0xFFFF;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]}[/size][/font][/backcolor][/color]
1853浏览量 1回复量 关注量 -
Nutool Pinconfigure不能打开文件 sos
使用pincongfig配置好后,能正常保存,但就是无法打开,每次打开自己保存的cfg文件时,都弹出“来自网页的信息 the config file is incorrect.”。论坛有哪位大侠知道是啥原因不?以前可以用,后来不知咋的,一直这问题用不了,很是郁闷,新唐官方说是系统问题,但说不出是系统哪个问题引起。
671浏览量 0回复量 关注量 -
汽车电子——OBD的底盘地和逻辑地有区别吗?
OBD端子上的PIN4为底盘地,PIN5为逻辑地,这两个地有区别吗? 在接线的时候,如果既要从OBD上取电,又要从OBD上出其他信号,这个地该怎么接呢? 有哪位大神帮忙解答一下,谢谢~
1345浏览量 3回复量 关注量 -
公司一台美国的测试设备坏了,主控板的一个光耦型号从...
公司一台美国的测试设备坏了,拆开维修主控板,发现信号在一个光耦处出现异常,想购买一个回来更换,丝印"SHO 364", 4PIN, 网上一直搜索不到型号,求见多识广的高手指出
942浏览量 2回复量 关注量