问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - pi
  • 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 读取结果

    选择 pi ST APM32E103 成功 寄存器操作

    62浏览量 0回复量 关注量
  • 引脚复用配置 sos

    在配置GPIO_InitStructure.GPIO_Alternate属性的时候,有时候会看到类似[font=Droid Sans Mono, monospace, monospace][color=#5d5d5f]GPIO_AF2_TIM3或GPIO_AF4_TIM3。请问这里的AFx的x应该如何选择?[/color][/font]

    IO gp pi GPIO 复用 引脚

    492浏览量 0回复量 关注量
  • 使用MCC的I2C, notification中出現了警告: sos

    SPI MASTER...如下圖, 請問如何解決? Please add a confication to ensure proper functionality! 我沒有使用SPI阿? 我的芯片是dspic 33ck32mp102,

    pi spi 使用 I2c notification 警告

    330浏览量 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; }

    IO gp pi IAP在线升级 APM32F003 中断向量

    556浏览量 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

    pi timer ni led灯 PWM输出 TI

    533浏览量 0回复量 关注量
  • GD32E230 待机了,怎么唤醒

    待机了,怎么唤醒使用PA0作为WAKEUP_PIN, 试了 没有效果,还需要哪些配置?

    PA0 使用 PA pi GD32E230

    997浏览量 5回复量 关注量
  • 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_ */

    IO pi 红外模块 CH32V307 sr501 HC

    688浏览量 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 //救救孩子吧,不知道怎么改了

    IO TI pi HC-SR04 sr04超声波测距 沁恒CH32V307

    3033浏览量 8回复量 关注量
  • 为什么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);//写入数据 }

    pi 输出电压 AD 嵌入式 国产芯片 单片机

    1576浏览量 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]

    pi IO 低功耗 hc32l136 单片机 国产芯片

    1513浏览量 1回复量 关注量
  • 有没有使用GD32单片机的,使用DMA遇到问题

    问题是这样的:我使用GD32E23芯片,M0+内核,用GD的库函数,在使用USART和SPI的DMA方式传输数据时,每次数据传输完成都必须初始化DMA,否则无法完成下一次传输。但是初始化是很耗费时间的,就不能想ST那样直接清标志位实现下一次传输吗?搜索 [align=left]复制[/align]

    DMA 32单片机 spi gd32e23 pi

    2085浏览量 4回复量 关注量
  • stm32 调试 ads7843时读取结果为oxfff

    这两天在调试tft屏上带的触控功能ic---ADS7843,但是无论用STM32F107的GPIO模拟spi或是SPI3,读出来的数据都是oxfff

    STM32 ADS7843 调试 pi spi

    824浏览量 9回复量 关注量
  • Nutool Pinconfigure不能打开文件 sos

    使用pincongfig配置好后,能正常保存,但就是无法打开,每次打开自己保存的cfg文件时,都弹出“来自网页的信息 the config file is incorrect.”。论坛有哪位大侠知道是啥原因不?以前可以用,后来不知咋的,一直这问题用不了,很是郁闷,新唐官方说是系统问题,但说不出是系统哪个问题引起。

    CONFIG pi 新唐

    574浏览量 0回复量 关注量
  • 汽车电子——OBD的底盘地和逻辑地有区别吗?

    OBD端子上的PIN4为底盘地,PIN5为逻辑地,这两个地有区别吗? 在接线的时候,如果既要从OBD上取电,又要从OBD上出其他信号,这个地该怎么接呢? 有哪位大神帮忙解答一下,谢谢~

    OBD 汽车电子 pi 信号 接线

    1103浏览量 3回复量 关注量
  • 公司一台美国的测试设备坏了,主控板的一个光耦型号从...

    公司一台美国的测试设备坏了,拆开维修主控板,发现信号在一个光耦处出现异常,想购买一个回来更换,丝印"SHO 364", 4PIN, 网上一直搜索不到型号,求见多识广的高手指出

    主控板 光耦 测试设备 信号 pi

    792浏览量 2回复量 关注量