您的位置:首页 > 健康 > 养生 > 今天广州出什么大事了_小游戏网页版_最新新闻事件摘抄_竞价托管选择微竞价

今天广州出什么大事了_小游戏网页版_最新新闻事件摘抄_竞价托管选择微竞价

2025/3/12 10:01:26 来源:https://blog.csdn.net/weixin_42550185/article/details/145049040  浏览:    关键词:今天广州出什么大事了_小游戏网页版_最新新闻事件摘抄_竞价托管选择微竞价
今天广州出什么大事了_小游戏网页版_最新新闻事件摘抄_竞价托管选择微竞价

将“算法中的数组数据”转换为曲线图,是大多数下位机工程师梦寐以求的事情。算法一般是采用Matlab软件去做仿真测试,因为要涉及到数学,图形和编程。Matlab软件是数百万工程师和科学家都在使用的编程和数值计算平台,支持数据分析、算法开发和建模。如果没有Matlab软件,我们也可以借助KEIL和EXCEL来实现编程和绘制图形,实现一些简单的数据分析,还是可行的

我以前一直在想如何将数组中的数据绘制成曲线图,但一直没有去做。最近在搞算法移植,发现算法中的bug很多,于是边移植,边测试。实在没法子,想出了下面的方法。因为算法通常是对很多个数据进行分析,和硬件关系不大,于是,我就采用KEIL的软件模拟仿真功能来获取结果数据,然后利用EXCEL来绘制曲线图。操作步骤如下:

1、点击“Project”,然后点击“Options for target '项目名字'”,点击“Device”,选择CPU型号。

2、点击“OK”

3、点击“Target”,勾选“Use Micro LIB”。注意:如果不勾选,软件仿真时,会出现无法打印浮点数,或者不打印小数点

4、点击“OK”

5、点击“Debug”,配置如下:

注意:绿线左边属于软件仿真配置,绿线右边属于硬件仿真配置。

6、点击“OK”

7、重定义fputc函数,编写一个“USART1.c”,文件如下:

#include "USART1.h"

#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

void USART1_GPIO_Config(void);

void USART1_NVIC_Cpnfig(void);

void USART1_Mode_Cpnfig(unsigned int bound);

void USART1_SendByte(  unsigned char ch );

void USART1_SendString(  char *str);

void USART1_Serial_Interface_Enable(unsigned int bound);

//函数功能:USART1IO口配置

void USART1_GPIO_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

//设置USART1APB2外设时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;//选择PIN9,USART1TXD

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置引脚为复用推挽输出          

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置引脚的最高工作速率为50MHz

  GPIO_Init(GPIOA, &GPIO_InitStructure);

        

         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10; //选择PIN10,USART1RXD

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;       //设置引脚为输入悬浮 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置引脚的最高工作速率为50MHz

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

//函数功能:USART1 NVIC 配置

void USART1_NVIC_Cpnfig(void)

{

         NVIC_InitTypeDef NVIC_InitStructure;

         //NVIC_PriorityGroup_4设置NVIC中断分组4:表示抢占优先级为4,取值为0~15,没有响应优先级,取值为0

  //NVIC_PriorityGroup_3设置NVIC中断分组3:表示抢占优先级为3,取值为0~7,响应优先级只有1,取值为0~1

         //NVIC_PriorityGroup_2设置NVIC中断分组2:表示抢占优先级为2,取值为0~3,响应优先级只有2,取值为0~3

         //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4

         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    //选择中断源为USART1_IRQn

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13;

  //设置抢先优先级为13

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级为0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

//函数功能:USART1配置:波特率为bound,数字为8,停止位为1,无奇偶校验,允许发送和接收数据,允许中断,使能串口模块

void USART1_Mode_Cpnfig(unsigned int bound)

{

         USART_InitTypeDef USART_InitStructure;

        

         USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

         USART_InitStructure.USART_WordLength = USART_WordLength_8b;

         USART_InitStructure.USART_StopBits = USART_StopBits_1;

         USART_InitStructure.USART_Parity = USART_Parity_No ;

         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

         USART_Init(USART1, &USART_InitStructure);

        

         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断

//当开启串口中断,一定要写其中断服务程序,否则可能会导致FreeRTOS的任务不执行

        

         USART_Cmd(USART1, ENABLE); //使能串口

}

//函数功能:串口1发送一个字节

void USART1_SendByte(  unsigned char ch )

{

  USART_SendData(USART1, ch);

  while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);

  //等待发送完成标志位被置1       

}

//函数功能:串口1发送字符串

void USART1_SendString(  char *str)

{

  unsigned int k=0;

  do{

      USART1_SendByte(  *(str + k) );

      k++;

    }while(*(str + k)!='\0');

}

//函数功能:USART1配置

void USART1_Serial_Interface_Enable(unsigned int bound)

{

         USART1_GPIO_Config();

  USART1_NVIC_Cpnfig();

  USART1_Mode_Cpnfig(bound);

}

//函数功能:USART1中断服务函数

void USART1_IRQHandler(void)

{

         unsigned char temp;

         (void)temp;//不让temp产生警告

         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

         {

                   temp=USART_ReceiveData(USART1); //GSM串口读取一个字节;

         }

         if(USART_GetFlagStatus(USART1,USART_FLAG_PE) != RESET)

         {

                   USART_ReceiveData(USART1);//读串口

                   USART_ClearFlag(USART1, USART_FLAG_PE);

         }

  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) != RESET)

  {

                   USART_ReceiveData(USART1);//读串口

    USART_ClearFlag(USART1,USART_FLAG_ORE); //清除溢出中断

  }

         if(USART_GetFlagStatus(USART1,USART_FLAG_FE) != RESET)

         {

                   USART_ReceiveData(USART1);//读串口

                   USART_ClearFlag(USART1,USART_FLAG_FE);

         }

}

//加入以下代码,支持printf函数

//在进行硬件仿真时,可不需要选择“use MicroLIB

//但在进行软件仿真时,必须勾选“use MicroLIB”,否则,无法打印“浮点数”

#if VirtualSerialPort == 1

#pragma import(__use_no_semihosting)

//标准库需要的支持函数

struct __FILE

{

         int handle;

};

FILE __stdout;

//定义_sys_exit()以避免使用半主机模式

void _sys_exit(int x)

{

         x = x;

}

//重定义fputc函数

//函数功能:发送ch的值给USART1串口

int fputc(int ch, FILE *f)

{

  USART_SendData(USART1, (unsigned char) ch);

  while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);

  //等待发送完成标志位被置1       

         return ch;

}

#else

#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))

#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))

#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))

#define TRCENA          0x01000000

struct __FILE

{

  int handle; /* Add whatever you need here */

};

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f)

{

         if (DEMCR & TRCENA)

         {

    while (ITM_Port32(0) == 0);

   ITM_Port8(0) = ch;

  }

  return(ch);

}

#endif

8、“USART1.h”文件如下:

#ifndef __USART1_H

#define   __USART1_H

#include "stm32f10x.h"

//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t

#define VirtualSerialPort  1   //使用UART1printf功能

//#define VirtualSerialPort  0 //使用JLINK虚拟串口的printf功能

extern void USART1_SendByte(  unsigned char ch );

extern void USART1_SendString(  char *str);

extern void USART1_Serial_Interface_Enable(unsigned int bound);

#endif /* __USART1_H */

9、“main.c”文件如下:

#include "stm32f10x.h"

//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t

#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

#include "USART1.h"

/*注意:"USART1.h"要放在 "stdio.h" 包含文件之后,如果这个位置颠倒了,业不能打印浮点数。*/

#define MyArray_Size   120

int16_t MyArray[MyArray_Size]={\

-12,0,13,26,40,53,66,79,92,104,\

116,127,137,147,156,164,171,177,182,187,\

191,193,195,197,197,197,197,195,194,192,\

189,187,184,181,178,174,170,167,163,159,\

155,151,148,144,140,136,132,128,123,119,\

115,111,106,102,97,92,87,81,75,69,\

63,56,49,41,32,23,13,3,-7,-19,\

-31,-44,-57,-70,-83,-96,-109,-121,-133,-144,\

-154,-163,-172,-179,-186,-192,-197,-202,-205,-208,\

-211,-213,-214,-215,-215,-215,-214,-213,-212,-210,\

-207,-205,-202,-198,-194,-190,-185,-180,-175,-169,\

-162,-155,-148,-140,-132,-124,-114,-105,-95,-84\

};

void Print_MyArray(void)

{

         int16_t i,d;

         for(i=0;i<MyArray_Size;i++)

         {

                   d=MyArray[i];

                   printf("%d\r\n", d);

         }

}

int main(void)

{

         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4

         USART1_Serial_Interface_Enable(115200);

         printf("\r\nCPU reset\r\n");

 while(1)

 {

          Print_MyArray();

 }

}

10、点击“Debug”,点击“View”,点击“Serial Windows”,点击“UART#1”,就可以打开KEIL中的串口1,见下图:

11、按“F10”,就可以过程仿真了。

12、在“UART #1”的窗口中,点击“右键”,得到下图:

13、点击“Clear Window”,清除窗口中的数据。

14、按“F10”打印数据数据,见下图:

15、在“UART #1”的窗口中,点击“右键”,点击“Copy to Clipboard”,拷贝窗口中的数据。打开EXCEL,将拷贝的数据粘贴到EXCEL表格中。见下图:

16、将“粘贴的数据”框起来,然后点击“插入”,点击“散点图”,点击“带平滑线的散点图”,见下图:

总结:
我感觉很不错,也许很多人在用这个方法,就是没有写出来而已。比如:AD转换后,得到一组数据,我们需要看滤波数据效果,这时我们会想到曲线图,通过它,我们可以值观地看到数据的走势

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com