|
使用的是H7B0 adc用的是ads8556
内存是这样弄的
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
;RW data - 128KB DTCM
RW_IRAM1 0x20000000 0x00020000 {
.ANY (+RW +ZI)
}
;RW data - 1024KB AX1 SRAM
RW_IRAM2 0x24000000 0x00100000 {
*(.RAM_D1)
}
;RW data - 64KB SRAM1(0x30000000) + 64KB SRAM2(0x30010000)
RW_IRAM3 0x30000000 0x00020000 {
*(.RAM_D2)
}
;RW data - 32KB SRD_SRAM(0x38000000)
RW_IRAM4 0x38000000 0x00008000 {
*(.RAM_D3)
}
}
RAM_D1用来做显存
dma没法直接操作RW_IRAM1
所以 adc_buff 定义到 D2
__attribute__((section (".RAM_D2"))) int8_t adc_buff[16];
HAL_DMA_Start_IT(&TIMDMA, (uint32_t)0x60000000, (uint32_t)adc_buff, 16);
开始获取数据
但是出现了一个问题 在软件开始初始化 数组adc_buff 为0后 DMA不会把数据放进去 数组里面数据全是0
不对 adc_buff 做初始化处理 通过MDK 在线观察 adc_buff 一直更新
在 回调函数中 对 adc_buff 进行搬运 又出现 adc_buff只显示1次 后面不更新了
把 关于 adc_buff处理 的地方注释掉不做任何处理又可以实时更新了
不知道那个地方设置不对 求教
fmc用的是8bit总线
dma配置参考的例子
/* 定时器UP更新触发DMA传输 */
TIMDMA.Instance = DMA1_Stream2; /* 例化使用的DMA数据流 */
TIMDMA.Init.FIFOMode = DMA_FIFOMODE_ENABLE; /* 使能FIFO*/
TIMDMA.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* 用于设置阀值 */
TIMDMA.Init.MemBurst = DMA_MBURST_INC8; /* 用于存储器突发 */
TIMDMA.Init.PeriphBurst = DMA_PBURST_INC8; /* 用于外设突发 */
TIMDMA.Init.Request = DMA_REQUEST_TIM5_UP; /* 请求类型 - TIM5_up */
TIMDMA.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 传输方向是从外设到存储器 */
TIMDMA.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设地址自增禁止 */
TIMDMA.Init.MemInc = DMA_MINC_ENABLE; /* 存储器地址自增使能 */
TIMDMA.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; /* 外设数据传输位宽选择字节,即8bit */
TIMDMA.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; /* 存储器数据传输位宽选字节,即8bit */
TIMDMA.Init.Mode = DMA_CIRCULAR; /* 循环模式 */
TIMDMA.Init.Priority = DMA_PRIORITY_LOW; /* 优先级低 */
/* DMA传输完成回调函数 */
void adc_dma_call_back(DMA_HandleTypeDef *hdma)
{
TIM_HandleTypeDef TimHandle = {0};
TimHandle.Instance = TIM5;
adc_list[0][sample_cnt] = adc_buff[8] + (adc_buff[9] << 8);
adc_list[1][sample_cnt] = adc_buff[10] + (adc_buff[11] << 8);
adc_list[2][sample_cnt] = adc_buff[12] + (adc_buff[13] << 8);
adc_list[3][sample_cnt] = adc_buff[14] + (adc_buff[15] << 8);
sample_cnt++;
if(sample_cnt == SAMPLE_LEN)
{
sample_cnt = 0;
HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_1);
}
}
/* DMA半传输完成回调函数 */
void adc_dma_half_call_back(DMA_HandleTypeDef *hdma)
{
adc_list[0][sample_cnt] = adc_buff[0] + (adc_buff[1] << 8);
adc_list[1][sample_cnt] = adc_buff[2] + (adc_buff[3] << 8);
adc_list[2][sample_cnt] = adc_buff[4] + (adc_buff[5] << 8);
adc_list[3][sample_cnt] = adc_buff[6] + (adc_buff[7] << 8);
sample_cnt++;
}
|
|