Mbed OS STM32F429 中断方式接收 ADS1256
经过半个月的测试,希望能够通过 TIM 捕获 DRDY 信号,启动DMA 传送ADS1256 的数据,但是始终没有成功,最后采取了折中的方式,TIM 捕获DRDY 信号,产生中断,在中断程序中读取3个字节数据。通过UDP 传送到PC 机的python 做显示。
应为调试的很辛苦,所以要分享给大家。
- Mbed OS 项目为 ADS1256INT2020
- 数据采样频率为 30KHz
- 数据速率=30KHz*24bit=720bps
- 这样的速率STM32 完全应付的来。在网络上测试也就是720 K 多一点。(因为有网络的额外开销)
/* TI Ads1256 Inerrupt Mode testADS1256 sample rate 15KspsTIM red frequncy 7.5KHzgreen frequncy 15.625Hz
*/
#include "mbed.h"
#include "EthernetInterface.h"
#include "stm32f4xx_ll_tim.h"
#define RDATA 0x01
#define RDATAC 0x03
#define SDATAC 0x0F
#define SELFCAL 0xF0
#define SELFOCAL 0xF1
#define SELFGCAL 0xF2
#define SYSOCAL 0xF3
#define SYSGCAL 0xF4
#define SYNC 0xFC
#define ATANDBY 0xFD
#define RESET 0xFE
#define WAKEUP 0xFF
static const char* mbedIp = "192.168.31.110"; //IP
static const char* mbedMask = "255.255.255.0"; // Mask
static const char* mbedGateway = "192.168.31.1"; //Gateway
#define SERVER_PORT 2019
#define SERVER_ADDR "192.168.31.99"
#define UDP_PORT 2018
EthernetInterface eth;
UDPSocket udpsocket;
DigitalOut green_led(PC_6);
DigitalOut red_led(PC_7);
DigitalOut _rst(PB_5);
DigitalOut _sync(PE_5);
SPI _spi(PF_9,PF_8,PF_7);
DigitalOut _cs(PF_6);
DigitalIn _drdy(PA_6);TIM_HandleTypeDef htim3={0};
SPI_HandleTypeDef hspi5;
#define SAMPLES 240
#define HALF SAMPLES*3
#define MAX SAMPLES*3*2
uint8_t DataBuffer[MAX];
uint8_t ads1256_txbuf[8];
uint8_t ads1256_rxbuf[8];
int index;
bool halfFlg,fullFlg;
uint32_t ReadData();uint32_t ReadDataContinuous(uint32_t * buffer,int samples);void WriteControl(uint8_t ctrl);void write_reg(uint8_t command,uint8_t data);uint8_t read_reg(uint8_t command);void SetPGAgain(uint8_t gain);void SlectChannel(uint8_t ainp,uint8_t ainn);void Error_Handler(void)
{printf("HAL error\n");
}
extern "C" void TIM3_IRQHandler(void) {red_led=!red_led;DataBuffer[index++]=_spi.write(0x00);DataBuffer[index++]=_spi.write(0x00);DataBuffer[index++]=_spi.write(0x00);if (index==HALF) halfFlg=true;if (index==MAX) {index=0;fullFlg=true;}HAL_TIM_IRQHandler(&htim3);
}void TIM_Init(void){GPIO_InitTypeDef GPIO_InitStruct = {0};/* Peripheral clock enable */__HAL_RCC_TIM3_CLK_ENABLE();// __HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**TIM3 GPIO Configuration PA6 ------> TIM3_CH1 */GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);TIM_SlaveConfigTypeDef sSlaveConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};/* USER CODE BEGIN TIM3_Init 1 *//* USER CODE END TIM3_Init 1 */htim3.Instance = TIM3;htim3.Init.Prescaler = 0;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period =0xffff;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.RepetitionCounter = 0;if (HAL_TIM_IC_Init(&htim3) != HAL_OK){Error_Handler();}LL_TIM_EnableARRPreload(TIM3);LL_TIM_SetAutoReload(TIM3,0xffff);sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;sSlaveConfig.InputTrigger = TIM_TS_ITR0;if (HAL_TIM_SlaveConfigSynchronization(&htim3, &sSlaveConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;//TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();} HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);HAL_NVIC_EnableIRQ(TIM3_IRQn);};uint32_t ReadData()
{uint32_t value1,value2,value3;WriteControl(RDATA);wait_us(20);while(_drdy);value1=_spi.write(0xff);value2= _spi.write(0xff);value3= _spi.write(0xff);return (value1<<16) | (value2<<8) | value3;
}
void write_reg(uint8_t command,uint8_t data)
{while(_drdy);_spi.write(command | 0x50);_spi.write(0x00);_spi.write(data);}
uint8_t read_reg(uint8_t command)
{uint8_t v;while(_drdy);_spi.write(command | 0x10);_spi.write(0x00);//lengthwait_us(1);v=_spi.write(0xff);return v;
}
uint32_t ReadDataContinuous(uint32_t * buffer,int samples)
{ int i;uint32_t value;while(_drdy);WriteControl(RDATAC);for (i=0;i<samples;i++){ while(_drdy);value=_spi.write(0xff);value= (value<<8)+_spi.write(0xff);value= (value<<8)+_spi.write(0xff);buffer[i]=value;}return samples;}
void WriteControl(uint8_t ctrl)
{while(_drdy);_spi.write(ctrl);
}void init()
{ _cs=1;_sync=1;_rst=0;wait_ms(1);_rst=1;_cs=0;write_reg(0x00,0x04);//statuswait_us(1);write_reg(0x01,0x1);//MUXwait_us(1);write_reg(0x02,0x20);//ADCON PAG=1wait_us(1);write_reg(0x03,0xf0);// A/D Data Ratewait_us(1);write_reg(0x04,0x00);// GPIO Control Registerwait_us(1);while(_drdy);WriteControl(SELFCAL);wait_us(5);WriteControl(SYNC);wait_ms(20);WriteControl(WAKEUP);wait_us(5);}
void SetPGAgain(uint8_t gain)
{write_reg(0x02,gain);
}
void SlectChannel(uint8_t ainp,uint8_t ainn)
{write_reg(0x01,(ainp<<4) | ainn );write_reg(0x03,0x72);}
bool SensorDetected()
{//not implementreturn true;}int main() {printf("ADS_1256 DAQ testing\n");eth.set_network(mbedIp,mbedMask,mbedGateway);eth.connect();printf("\nConnected IP Address : %s\n", eth.get_ip_address());udpsocket.open(ð);udpsocket.bind(eth.get_ip_address(),UDP_PORT);// SPI_Init();_spi.format(8,1);_spi.frequency(4000000);init();printf("ADS1256 ChipID=%d\n",read_reg(00));printf("rate=%2x\n", read_reg(0x03));index=0;halfFlg=false;fullFlg=false; TIM_Init();HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);WriteControl(RDATAC);while (true) {if (halfFlg){halfFlg=false;udpsocket.sendto(SERVER_ADDR,SERVER_PORT, &DataBuffer[0], HALF);}if (fullFlg){fullFlg=false;udpsocket.sendto(SERVER_ADDR,SERVER_PORT, &DataBuffer[HALF], HALF);green_led =!green_led;}}
}
Python 接收程序(ADS1256UDP.PY)
import socket
import numpy as np
from matplotlib import pyplot as plt
def bytesToInt(h1,h2,h3):ba = bytearray()ba.append(h1)ba.append(h2)ba.append(h3)return int.from_bytes(ba, byteorder='big')HOST = '192.168.31.99'
PORT = 2019
BUFSIZ = 240*3
ADDR = (HOST,PORT)
udpSerSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udpSerSock.bind(ADDR)
t = np.linspace(0, 239, 240, True)
x =[]
y1 =[]
for i in range(240):x.append(i)y1.append(0)
plt.ion()
while True:data, addr = udpSerSock.recvfrom(BUFSIZ)for i in range(240):value= (bytesToInt(data[i*3+0],data[i*3+1],data[i*3+2])/8388607)*5-7.5y1[i]=valueplt.title("ADS1256")plt.ylim([-2.5,2.5]) plt.plot(t,y1) plt.pause(0.001)plt.clf()
Mbed OS STM32F429 中断方式接收 ADS1256相关推荐
- 【经验分享】RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据)
作者:杨源鑫 来源:嵌入式云IOT技术圈 一.RT-Thread简单介绍 大部分MCU工程师或多或少都接触过实时OS,如今实时操作系统种类繁多,我个人认为最有代表性的莫过于RT-Thread. 为什么 ...
- 全志V3S裸机串口驱动(中断方式接收,DMA接收有问题,小于32字节数据无法触发DMA传输)
调试DMA接收遇到了个很奇怪的问题,就是DMA发送没问题,DMA接收的时候,如果数据小于32字节,数据被DMA从串口接收FIFO中取走了,但是并不会传输到指定的buff中,这个就没法用于接收未知长度的 ...
- STM32中断方式接收方式每次一个字节同时发生接收一段时间后不能再次接收问题
问题产生原因: 频繁的发送数据和频繁的接收数据串口将产生过载错误:这就导致接收中断使能关闭: SR寄存器标志产生过载 产生错误时寄存器值的变化 解决办法: 重新打开中断接收标志 if((huart1. ...
- HAL库中断方式实现串口通信操作
文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...
- 采用串口中断方式实现串口通信
文章目录 前言 一.中断介绍 1.中断方式 2.中断优先级 3.中断向量 二.利用STM32CubeMX配置项目 三.在keil配置代码 四.实际效果 五.总结 六.参考资料 前言 一.中断介绍 1. ...
- 采用串口中断方式实现串口通信:停止/持续发送“hello windows!”
文章目录 一.stm32接收到字符"s"/"t"时停止/持续发送"hello windows!" 1.STM32CubeMX工程创建 2.程 ...
- 【嵌入式系统开发13】采用串口中断方式完成单字符接受与字符串接受
本文目的是主要介绍通过STM32F103C8T6接收到字符"s"时,停止持续发送"hello windows!"; 当接收到字符"t"时,持 ...
- MBED OS 参考手册-边读边翻译,
参考手册从总体上.运行时.配置.模块技术和API方面对MBED OS进行了全面的介绍. 在阅读参考手册的同时,翻译了部分资料. 1 概述 1.1 Mbed OS 参考手册 应用代码采用C++编写 ...
- 串口的空闲中断+DMA接收(附F4代码)
传统串口接受与发送: 串口接受一个很长的帧,接受帧时依靠串口中断每次只能传输8位,传一个帧要进入好多次中断,每次进入中断都要判断是否接收完毕. DMA串口接收与发送: 1,电脑通过串口1给STM32F ...
- UART0串口编程(三):中断方式的串口编程;用中断编写发送函数
UART0串口编程(三) 一:中断方式的串口编程 1.用中断方式编写串口程序由那几部分组成 2.硬件上的支持 1>UART0 发送FIFO缓冲区 A.UART0含有1个16字节的发送FIFO缓冲 ...
最新文章
- Docker数据卷管理
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
- 一次简单的Java服务性能优化,实现压测 QPS 翻倍
- dell 服务器 加ssd硬盘,DELL服务器加SSD硬盘.doc
- Lintcode---统计比给定整数小的数的个数
- JVM内存管理概述与android内存泄露分析
- python分析数据走势_python数据分析应用 - 近5年八类资产价格走势分析
- 2017北京国庆刷题Day2 afternoon
- C# SyncDictionary类
- Java的break和continue关键字
- ArcGIS10.2安装的详细步骤、注意事项及许可变永久操作
- linux为mysql创建gpower_实战:在Java Web 项目中使用HBase
- SaaS-HRM 需求分析
- Oracle 分组求和(特殊处理)
- 魔方怎么更改计算机名,软媒魔方怎么通过设置向导进行设置
- 解决:openstack-dashboard-登陆后显示报错
- Linux下限制带宽的方法
- 服务器蓝屏的原因及解决办法
- 本土战略 Ubuntu创始人宣布将发中国版
- 入魔了~《武林外传》!
热门文章
- Vue学习笔记(一) 基础+指令+侦听器+计算属性+vue-cli
- 【ITool】js多个页面传值
- MySQL高级查询语句(一)排序、运算符、别名、子查询、内外连接
- 偶然发现的写参考文献的利器(超快搜索+快捷摘要总结)、文末再讲一下EndNote的使用心得
- 2020仙气十足的女生个性网名
- 【人工智能】【1024】谷歌量子计算突破登Nature封面,号称200秒顶超算10000年!
- linux命令看进程的tcp链接,Linux下查看TCP连接的状态的shell命令
- 使用yguard混淆,名字出现超长字符 map=“ooooooooooooooo”
- Google I/O 2021: 在重要时刻提供帮助
- 本经阴符七术--鬼谷子