AD7689_Config = AD7689_CFG<<13|AD7689_INCC<<10|AD7689_INx<<7|AD7689_BW<<6|AD7689_REF<<3|AD7689_SEQ<<1|AD7689_RB; AD7689_Config <<=2;
时间: 2023-08-06 19:07:14 浏览: 75
在给定的代码中,AD7689_Config变量通过位操作符(<<)进行了移位操作,然后再次移位了2位。
AD7689_Config <<= 2; 这行代码将AD7689_Config变量的值向左移动了2位。这意味着原来在AD7689_Config中的所有位都向左移动了2个位置,并且在右侧填充了两个零位。这可能是为了对配置进行进一步的调整或者对其进行适当的位对齐。
请注意,这里提供的代码片段没有给出完整的上下文,因此无法确定具体的应用。但是,根据给出的代码,可以推测该行代码的目的是对AD7689_Config进行进一步处理或者调整。
相关问题
#include "bflb_adc.h" #include "bflb_mtimer.h" #include "board.h" struct bflb_device_s adc; #define TEST_ADC_CHANNELS 2 #define TEST_COUNT 10 struct bflb_adc_channel_s chan[] = { { .pos_chan = ADC_CHANNEL_2, .neg_chan = ADC_CHANNEL_GND }, { .pos_chan = ADC_CHANNEL_GND, .neg_chan = ADC_CHANNEL_3 }, }; int main(void) { board_init(); board_adc_gpio_init(); adc = bflb_device_get_by_name("adc"); / adc clock = XCLK / 2 / 32 */ struct bflb_adc_config_s cfg; cfg.clk_div = ADC_CLK_DIV_32; cfg.scan_conv_mode = true; cfg.continuous_conv_mode = false; cfg.differential_mode = true; cfg.resolution = ADC_RESOLUTION_16B; cfg.vref = ADC_VREF_3P2V; bflb_adc_init(adc, &cfg); bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); for (uint32_t i = 0; i < TEST_COUNT; i++) { bflb_adc_start_conversion(adc); while (bflb_adc_get_count(adc) < TEST_ADC_CHANNELS) { bflb_mtimer_delay_ms(1); } for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) { struct bflb_adc_result_s result; uint32_t raw_data = bflb_adc_read_raw(adc); printf("raw data:%08x\r\n", raw_data); bflb_adc_parse_result(adc, &raw_data, &result, 1); printf("pos chan %d,neg chan %d,%d mv \r\n", result.pos_chan, result.neg_chan, result.millivolt); } bflb_adc_stop_conversion(adc); bflb_mtimer_delay_ms(100); } while (1) { } }根据以上代码对bl618程序的编写对以下stm32中代码#include "stm32f10x.h" #include "delay.h" #include "FSR.h" #include "usart.h" #include "adc.h" #define PRESS_MIN 20 #define PRESS_MAX 6000 #define VOLTAGE_MIN 150 #define VOLTAGE_MAX 3300 u8 state = 0; u16 val = 0; u16 value_AD = 0; long PRESS_AO = 0; int VOLTAGE_AO = 0; long map(long x, long in_min, long in_max, long out_min, long out_max); int main(void) { delay_init(); NVIC_Configuration(); uart_init(9600); Adc_Init(); delay_ms(1000); printf("Test start\r\n"); while(1) { value_AD = Get_Adc_Average(1,10); VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300); if(VOLTAGE_AO < VOLTAGE_MIN) { PRESS_AO = 0; } else if(VOLTAGE_AO > VOLTAGE_MAX) { PRESS_AO = PRESS_MAX; } else { PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX); } printf("ADÖµ = %d,µçѹ = %d mv,ѹÁ¦ = %ld g\r\n",value_AD,VOLTAGE_AO,PRESS_AO); delay_ms(500); } } long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }移植到bl618进行改写
以下是将上述STM32代码移植到BL618进行改写后的代码:
```c
#include "bl602.h"
#include "bl_adc.h"
#include "bl_gpio.h"
#include "bl_mtimer.h"
#include "stdio.h"
#define PRESS_MIN 20
#define PRESS_MAX 6000
#define VOLTAGE_MIN 150
#define VOLTAGE_MAX 3300
#define ADC_CHANNEL 0
#define ADC_CLK_DIV 5
#define ADC_RESOLUTION ADC_RESOLUTION_12B
#define ADC_VREF ADC_VREF_3V3
long map(long x, long in_min, long in_max, long out_min, long out_max);
int main(void)
{
bl_mtimer_init();
bl_gpio_enable_output(PIN_11, 1);
bl_adc_init();
bl_adc_config_t cfg = {
.inputMode = ADC_INPUT_SINGLE_END_MODE,
.input = ADC_INPUT_CH0,
.clkDiv = ADC_CLK_DIV,
.resolution = ADC_RESOLUTION,
.refSel = ADC_VREF,
};
bl_adc_channel_config(ADC_CHANNEL, &cfg);
printf("Test start\r\n");
while (1)
{
bl_adc_start();
while (!bl_adc_fifo_data_count())
{
bl_mtimer_delay_us(100);
}
uint16_t value_AD = bl_adc_read_fifo_data();
int VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300);
long PRESS_AO = 0;
if (VOLTAGE_AO < VOLTAGE_MIN)
{
PRESS_AO = 0;
}
else if (VOLTAGE_AO > VOLTAGE_MAX)
{
PRESS_AO = PRESS_MAX;
}
else
{
PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);
}
printf("AD value = %d, voltage = %d mV, pressure = %ld g\r\n", value_AD, VOLTAGE_AO, PRESS_AO);
bl_mtimer_delay_us(500000);
}
}
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
```
在BL618中,需要使用`bl_adc_init()`进行ADC模块的初始化,并通过`bl_adc_channel_config()`配置ADC通道。需要注意的是,BL618的ADC模块不支持差分模式,因此需要将原来的差分模式改为单端模式。在进行ADC转换时,可以使用`bl_adc_start()`触发转换,并通过`bl_adc_fifo_data_count()`和`bl_adc_read_fifo_data()`获取转换结果。此外,由于BL618中没有提供延时函数,需要使用`bl_mtimer_delay_us()`进行延时。
u16 SPI_AD7689_Read(u8 AD7689_CFG, u8 AD7689_INx) { u16 AD7689_Config=0,AD7689_Data; u8 i; AD7689_Config = AD7689_CFG<<13|AD7689_INCC<<10|AD7689_INx<<7|AD7689_BW<<6|AD7689_REF<<3|AD7689_SEQ<<1|AD7689_RB; AD7689_Config <<=2; AD7689_CNV = 0; AD7689_Delay(); for(i=0;i<16;i++) { if(AD7689_Config&0x8000) { AD7689_MOSI = 1 ; } else { AD7689_MOSI = 0; } AD7689_Delay(); AD7689_SCK = 0; AD7689_Delay(); AD7689_Config <<= 1; AD7689_SCK = 1; AD7689_Delay(); AD7689_Data <<=1; if(AD7689_MISO) { AD7689_Data |=1; } } AD7689_Delay(); AD7689_SCK = 0; AD7689_Delay(); AD7689_CNV = 1; return AD7689_Data; }
这段代码是用于通过SPI接口读取AD7689模数转换器的数据。以下是对代码的解释:
函数原型:u16 SPI_AD7689_Read(u8 AD7689_CFG, u8 AD7689_INx)
- 参数 AD7689_CFG:用于配置AD7689的控制位。
- 参数 AD7689_INx:用于选择要转换的输入通道。
函数内部变量:
- AD7689_Config:用于存储通过位操作合并后的配置参数。
- AD7689_Data:存储从AD7689读取的数据。
- i:循环计数器。
代码解释:
1. 首先,将给定的配置参数通过位操作符(<<、|)进行组合,并将结果存储在AD7689_Config变量中。
2. 对AD7689_Config进行左移2位。
3. 将AD7689_CNV(转换引脚)置为0,并调用AD7689_Delay()函数进行延时。
4. 进行一个16次的循环,每次循环处理一个bit的数据。
5. 在每次循环中,根据AD7689_Config的最高位来决定AD7689_MOSI(主设备输出)引脚的状态。
6. 进行适当的延时,并通过AD7689_SCK(时钟引脚)进行时钟信号的控制。
7. 将AD7689_Data左移1位,并根据AD7689_MISO(主设备输入)引脚的状态设置AD7689_Data的最低位。
8. 完成循环后,再次进行延时,并将AD7689_SCK置为0。
9. 最后,将AD7689_CNV(转换引脚)置为1,并返回读取的AD7689_Data。
需要注意的是,代码中的AD7689_Delay()函数用于实现延时,但代码中没有给出其具体实现。此外,代码中的AD7689_MOSI、AD7689_MISO、AD7689_SCK和AD7689_CNV等引脚可能需要根据具体硬件进行定义和配置。
阅读全文