[其他ST产品] newlab平台stm32总结

[复制链接]
1996|59
 楼主| 纠结的那些年 发表于 2023-8-26 18:01 | 显示全部楼层
线路连接: 1698564e9cd892970e.png
 楼主| 纠结的那些年 发表于 2023-8-26 18:01 | 显示全部楼层
三、TFTLCD输出
NEWLab的TFT模块采用了ILI9341控制器,其外形如图85所示。该模块有如下特点:
2.8寸屏幕。 320×240的分辨率。 16位真彩显示。 自带触摸屏,可以用来作为控制输入
 楼主| 纠结的那些年 发表于 2023-8-26 18:02 | 显示全部楼层
步骤:
与LCD相似
1.初始化TFTLCD
2.相关函数的使用如下代码
线路连接:
 楼主| 纠结的那些年 发表于 2023-8-26 18:02 | 显示全部楼层
 楼主| 纠结的那些年 发表于 2023-8-26 18:02 | 显示全部楼层
显示图片步骤:
1.打开Image2Lcd软件
2.点击右上角打开按钮,选择你要的图片
3.其他设置如下图
首先,按照图811所示,配置Image2LCD的工作模式。其中,
输出数据类型:“C语言数组(.C)”
扫描模式:水平扫描
输出灰度:16位真彩色
最大宽度和高度:与图片的大小和液晶屏的大小相匹配。
选择包含图像头数据
选择自底至顶扫描
注:像素大小不得超过240320 若超过,请使用如"图画"软件缩减图片尺寸
 楼主| 纠结的那些年 发表于 2023-8-26 18:02 | 显示全部楼层
 楼主| 纠结的那些年 发表于 2023-8-26 18:02 | 显示全部楼层
4.创建一个img.h文件,将生成的c语言数组放入文件中,使用GLCD_DrawBitmap (0 ,0, 180, 240, (const uint8_t *)gImage_test)函数实现图像显示
 楼主| 纠结的那些年 发表于 2023-8-26 18:02 | 显示全部楼层
  1. #include "stm32f10x.h"                  // Device header
  2. #include "GLCD_Config.h"
  3. #include "Board_GLCD.h"
  4. #include "img.h"
  5. #include "delay.h"
  6. #include "stdlib.h"
  7. extern GLCD_FONT GLCD_Font_16x24;//外部字体变量
  8. extern GLCD_FONT GLCD_Font_6x8;
  9. uint32_t n;
  10. double num;
  11. char str[25];
  12. int main(void)
  13. {
  14.         GLCD_Initialize();//初始化LCD
  15.         GLCD_ClearScreen();//清屏
  16.         GLCD_SetForegroundColor(GLCD_COLOR_BLACK);//前景颜色
  17.         GLCD_SetBackgroundColor(GLCD_COLOR_WHITE);//背景颜色
  18.         GLCD_SetFont(&GLCD_Font_16x24);//设置字体,高度25,宽度16
  19.      //hight 24*13=312 < 320    lenth 16*15=240
  20.         GLCD_ClearScreen();        //清屏
  21.        
  22.         //GLCD_SetForegroundColor(GLCD_COLOR_BLACK);
  23.         //GLCD_DrawPixel(11,22);//1.绘制一个像素点
  24.         //GLCD_DrawHLine(1,1,120);//2.绘制横线
  25.         //GLCD_DrawVLine(1,1,120);//3.绘制竖线
  26.         //GLCD_DrawHLine(1,120,120);
  27.         //GLCD_DrawVLine(120,1,120);
  28.        
  29.         //4.绘制字符串
  30.         num = 123.4567;
  31.   sprintf(str, " %f" , num);
  32.         GLCD_SetFont(&GLCD_Font_6x8);
  33.         //GLCD_SetFont(&GLCD_Font_16x24);
  34.                                                                                                 //hight 24*13=312 < 320    lenth 16*15=240
  35.         GLCD_DrawString(24,24,str);
  36.         //GLCD_DrawString(24, 24,"HuNan City");//
  37.        
  38.         //5.绘制矩形框
  39.         //GLCD_SetForegroundColor(GLCD_COLOR_GREEN);//ǰ¾°£¨×Ö·û£©ÑÕɫΪÂÌÉ«
  40.         //GLCD_DrawRectangle(10,10,120,120);
  41.        
  42.         //6.绘制线条,
  43.         //GLCD_SetForegroundColor(GLCD_COLOR_BLACK);//
  44.         //GLCD_DrawBargraph(30,0,200,40,10);//x,y,weight(0~240),height(0~320),val<100
  45.        
  46.         //7.绘制图像
  47.         //GLCD_DrawBitmap (0 ,0, 180, 240, (const uint8_t *)gImage_test);//ÏÔʾͼÏñ
  48.         //x,y,width(<=240),height(<=320)
  49.        
  50.         //8.向下滚动屏幕n个像素点,滚动条
  51.         //GLCD_VScroll(12);
  52.         //delay_s(1);
  53.         //GLCD_VScroll(100);
  54.        
  55.   
  56.        
  57.         while(1)
  58.         {               
  59.          //GLCD_VScroll(40);
  60.          //delay_s(1);
  61.         }
  62. }

 楼主| 纠结的那些年 发表于 2023-8-26 18:03 | 显示全部楼层
三、串口输出
串口通信接口为USART
TX代表发送 RX代表接收
RX1 PA10 TX1 PA9 连接底部引脚 所以可以直接通过NEWLAB板通信
RX2 PA2 TX2 PA3
RX3 PB11 TX3 PB10

串口发送代码实现:
导入usart.c驱动文件,驱动文件已经设置好三个串口的引脚,只要在使用时更改定义的引脚即可,其他不需要改变
stm32中,c语言的printf函数被默认打印在串口上
 楼主| 纠结的那些年 发表于 2023-8-26 18:03 | 显示全部楼层
串口接收代码实现
查询方式接收:将接收到的数据发送回电脑,usart.c文件中,在串口1初始化函数中,将USART_ITConfig是否开启串口中断函数的ENABLE改为DISABLE,防止调用中断函数
 楼主| 纠结的那些年 发表于 2023-8-26 18:03 | 显示全部楼层
使用中断方式接收:可以在数据收到的第一时间,马上跳转到中断函数来做及时的处理,提高实时性

 楼主| 纠结的那些年 发表于 2023-8-26 18:03 | 显示全部楼层

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "key.h"
extern unsigned char  LED7Code[];
int main (void){//
        u8 a;
        //初始化程序
        RCC_Configuration(); //时钟设置
        LED8_Init();//8位数码管初始化
        USART1_Init(115200); //串口初始化

        while(1){
                //实现串口控制8位数码管
                if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET){  //查询串口标志位
                        a = USART_ReceiveData(USART1);//读取接收到的数据
                        printf("%c",a); //把收到的数据发送到电脑
                        if(a>='0'&&a<='9'){
                                GPIO_Write(GPIOA,LED7Code[a-'0']);//显示数字
                        }
                }
                LATCH_KEY1();//按下key1,发送key1被按下信息
                LATCH_KEY2();//按下key2,发送key2被按下信息

//      delay_ms(1000);
        }
}


 楼主| 纠结的那些年 发表于 2023-8-26 18:03 | 显示全部楼层
用例
WIFI模块
步骤:
1.连接
2.平台命令获取及分析
3.单片机数据发送
接线:
stm32 P10 Tx - wifi RX
stm32 P11 Rx - wifi TX
 楼主| 纠结的那些年 发表于 2023-8-26 18:03 | 显示全部楼层
  1. int main()
  2. {
  3.         uint8_t IpData[128];
  4.         int8_t temp;//检验热点是否连接成功,成功为1,失败为0
  5.         uint8_t TryCount=0;
  6.         RCC_Configuration(); //系统时钟初始化
  7.         TIM2_Init();
  8.         USART1_Init(115200);//串口一初始化
  9.         printf("init...\r\n");
  10.         UART4_Init(115200);//WiFi串口四初始化
  11.         for(TryCount=0; TryCount<3; TryCount++)//三次连接
  12.         {
  13.                 printf("start link %d times.\r\n",TryCount+1);
  14.                 temp=ConnectToServer((char *)MY_DEVICE_ID, (char *)MA_SECRET_KEY);//连接热点和服务器
  15.                 if(temp != 0)//连接失败 temp = -1:WIFI模式设置错误 -2:WIFI连接错误 -3:端口或地址错误 -4:第一次握手数据发送错误 -5未响应错误
  16.                 {
  17.                         printf("Connect To Server ERROR=%d\r\n",temp);
  18.                 }
  19.                 else
  20.                 {
  21.                         break;
  22.                 }
  23.         }
  24.         printf("link success\r\n");
  25.         ClrAtRxBuf();//清空AT缓存
  26.         //==================以上为WIFI连接函数===========================

  27.         while(1)
  28.         {
  29.         //===================以下为WIFI接收到云平台数据函数==================
  30.                 if(F_AT_RX_FINISH)//判断是否接收到UART4_RX数据
  31.                 {         // 接收到数据包
  32.                         ESP8266_GetIpData((uint8_t *)AT_RX_BUF, (char *)IpData);//获取数据,存入IpData
  33.                         USER_DataAnalysisProcess((char *)IpData);//分析数据,在这个函数里对数据进行处理
  34.                         memset(IpData, 0x00, 128);//清空数据
  35.                         ClrAtRxBuf();
  36.                 }
  37.                 ///==================已下为WIFI发送单片机数据到云平台函数==================
  38.                 if(TimeCount >= 1000)//10S发送一次数据 timeCount每计数100次代表1s
  39.                 {
  40.                         TimeCount=0;
  41.                         ESP8266_SendSensor((char *)"wind", (char *)"2020-10-16 14:10:26", GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0));//发送数据函数,参数1标识名 参数二:时间 参数三:数据如温度,低频高低
  42.                         ClrAtRxBuf();
  43.                 }
  44.         }
  45.        
  46. }

  47. //=================以下为分析函数具体实现============
  48. void USER_DataAnalysisProcess(char *RxBuf)
  49. {
  50.         char *cmdid = NULL;
  51.         uint8_t TxetBuf[128];//发送数据
  52.         if(strstr((const char *)RxBuf, (const char *)PING_REQ) != NULL)//心跳请求//strstr()查找子串在主串第一次出现的位置,判断是否收到数据
  53.         {
  54.                 if(ESP8266_IpSend((char *)PING_RSP, strlen((const char *)PING_RSP)) < 0)//响应心跳
  55.                 {//发送失败
  56.                         printf("发送心跳包失败!\r\n");
  57.                 }
  58.                 else
  59.                 {
  60.                         printf("心跳包!\r\n");
  61.                 }
  62.         }
  63.         else if(strstr((const char *)RxBuf, (const char *)""t":5") != NULL)//命令请求//收到请求
  64.         {
  65.                 if(strstr((const char *)RxBuf, (const char *)""apitag":"ctrl"") != NULL)//判断收到的标识名
  66.                 {
  67.                         memset(TxetBuf,0x00,128);//清空缓存
  68. ///=====================操作代码书写区域=====================
  69.                         //==============判断收到的数据,在里面执行需要的操作==============
  70.                         if((strstr((const char *)RxBuf, (const char *)""data":1") != NULL))
  71.                         {
  72.                                 GPIO_SetBits(GPIOA,GPIO_Pin_0);
  73.                                 cmdid = USER_GetJsonValue((char *)RxBuf, (char *)"cmdid");
  74.                                 sprintf((char *)TxetBuf,"{"t":6,"cmdid":%s,"status":0,"data":1}",cmdid);
  75.                                 //printf("%s\r\n",TxetBuf);
  76.                                 if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
  77.                                 {//发送失败
  78.                                         //printf("发送响应失败!\r\n");
  79.                                 }
  80.                         }
  81.                         else if((strstr((const char *)RxBuf, (const char *)""data":0") != NULL))//关灯
  82.                         {
  83.                                 GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  84.                                 cmdid = USER_GetJsonValue((char *)RxBuf, (char *)"cmdid");
  85.                                 sprintf((char *)TxetBuf,"{"t":6,"cmdid":%s,"status":0,"data":0}",cmdid);
  86.                                 //printf("%s\r\n",TxetBuf);
  87.                                 if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
  88.                                 {//发送失败
  89.                                         printf("发送响应失败!\r\n");
  90.                                 }
  91.                         }
  92.                 }
  93.         }
  94. }
 楼主| 纠结的那些年 发表于 2023-8-26 18:04 | 显示全部楼层
  1. #ifndef _CloudReference_h_
  2. #define _CloudReference_h_
  3. //================在CloudReference.h设置WIFI名称和密码以及设备标识和传输密钥
  4. #define WIFI_AP                "xin"//WiFi热点名称
  5. #define WIFI_PWD        "987654321"        //WiFi密码
  6. #define WIFI_AP1                "zhjt_220"//WiFi热点名称
  7. #define WIFI_PWD1        "12345678zhjt"        //WiFi密码
  8. #define SERVER_IP        "120.77.58.34"        //服务器IP地址
  9. #define SERVER_PORT        8600                        //服务器端口号

  10. #define MY_DEVICE_ID  "light2018052790"//设备标识
  11. #define MA_SECRET_KEY "1d1c815e2a504ff9abcf6301134f27d3"//传输密钥

  12. #endif /*_CloudReference_h_*/

 楼主| 纠结的那些年 发表于 2023-8-26 18:04 | 显示全部楼层
语音模块
使用xfs5152ce.c和usart3.c极fifo.c文件,主要功能语音识别和文本合成
 楼主| 纠结的那些年 发表于 2023-8-26 18:04 | 显示全部楼层
步骤:
  1. /***************************************************************
  2.   *        Name                :        MAIN.C
  3.   *        Data                :        2019.7.15
  4.   *        Author        :        NIEAOWEI
  5.   *        Note                :        本实验主要是测试语音模块,连续读不卡顿,中断读,
  6.                                                         以及语音识别功能。
  7. ****************************************************************/
  8. #include "usart3.h"
  9. #include "delay.h"
  10. #include "fifo.h"
  11. #include "xfs5152ce.h"
  12. #include "usart1.h"

  13. int main(){
  14.         uint8_t data[10];
  15.         uint8_t a;
  16.         delay_init();
  17.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  18.         Usart1_Init(115200);
  19.         usart3_init();
  20.        
  21.         delay_ms(1);
  22.        
  23.         printf("start...\r\n");
  24.        
  25.         xfs_voice_start((unsigned char *)"请说出启动指令",XFS_FORMAT_GBK,1);//语音合成播放指定文本 *data 需要合成播放的文本 format 编码格式 wait_finish 是否等待上次合成结束
  26.         xfs_voice_start((unsigned char *)"请说出启动指令",XFS_FORMAT_GBK,1);//语音合成函数,可以播放想要的信息,参数1 要播放的文字 参数2 编码格式 参数3 是否等待上次合成结束,1等待
  27.         xfs_voice_start((unsigned char *)"请说出启动指令",XFS_FORMAT_GBK,1);
  28.         printf("%d,%d\r\n",usart3_rx_fifo.in,usart3_rx_fifo.out);
  29.        
  30.         //*delay_ms(1000);
  31.         if(xfs_recognize(&a, 5000) == 1)
  32.         {
  33.                 xfs_voice_start((unsigned char *)"语音识别成功", XFS_FORMAT_GBK, 1);
  34.                 sprintf((char *)data,"%d",a);
  35.                 xfs_voice_start((unsigned char *)data,XFS_FORMAT_GBK,1);
  36.                 xfs_voice_start((unsigned char *)cmd_word_list[a],XFS_FORMAT_GBK,1);
  37.         }else{
  38.                 xfs_voice_start((unsigned char *)"语音识别失败",XFS_FORMAT_GBK,1);
  39.         }
  40.         printf("re :%d\r\n",a);
  41.         for(a=0;a<100;a++){
  42.                 printf("%x,",usart3_rx_fifo.data[a]);
  43.         }
  44.         printf("%d,%d\r\n",usart3_rx_fifo.in,usart3_rx_fifo.out);
  45.        
  46.         while(1){
  47.                 delay_ms(1000);
  48.                 printf("runnig...\r\n");
  49.         };
  50.                
  51. }



 楼主| 纠结的那些年 发表于 2023-8-26 18:04 | 显示全部楼层
四、ADC输出
步骤:
1.时钟初始化
2.ADC初始化
3.声明外部变量,获取电压值,通过公式转化成对应的数据值
连线:
温度光照传感器J6,接PB0
ADC_IN1 PA1
ADC_IN4 PA4
ADC_IN5 PA5
ADC_IN6 PA6
ADC_IN7 PA7
ADC_IN8 PB0
ADC_IN9 PB1
ADC_IN10 PC0
ADC_IN11 PC1
ADC_IN12 PC2
ADC_IN13 PC3
 楼主| 纠结的那些年 发表于 2023-8-26 18:04 | 显示全部楼层

  1. #define ADC1_DR_Address    ((uint32_t)0x4001244C)//ADC1外设地址

  2. #define ADCPORT                GPIOB        //定义ADC接口
  3. #define ADC_CH8                GPIO_Pin_0       
  4. #define ADC_CH9                GPIO_Pin_1       
  5. vu16 ADC_DMA_IN5; //ADC数值存放的变量

  6. void ADC_DMA_Init(void){ //DMA初始化设置
  7.         DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体
  8.         DMA_DeInit(DMA1_Channel1);//复位DMA通道1
  9.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address
  10.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN5; //定义DMA通道ADC数据存储器(其他函数可直接读此变量即是ADC值)                //修改一:获取ADC数值地址
  11.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
  12.         DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小(根据ADC采集通道数量修改)                                                                                                                                                                //修改二:获取ADC的通道数
  13.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
  14.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址:Disable不变,Enable递增(用于多通道采集)                                //修改三:多道采集用Enable
  15.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
  16.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
  17.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
  18.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
  19.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
  20.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1
  21.         DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
  22. }
  23. void ADC_GPIO_Init(void){ //GPIO初始化设置
  24.         GPIO_InitTypeDef  GPIO_InitStructure;        
  25.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);      
  26.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟(用于ADC的数据传送)
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1时钟
  28.     GPIO_InitStructure.GPIO_Pin = ADC_CH8; //选择端口                                                                                                                                                                                                                                                                                            //修改四:  设置获取ADC端口的引脚                        
  29.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //选择IO接口工作方式      
  30.         GPIO_Init(ADCPORT, &GPIO_InitStructure);                                                                                                                                                                                                                                                                                                                                        //修改五:ADCPORT修改接口               
  31. }
  32. void ADC_Configuration(void){ //初始化设置
  33.         ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量
  34.         ADC_GPIO_Init();//GPIO初始化设置
  35.         ADC_DMA_Init();//DMA初始化设置
  36.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
  37.         ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描
  38.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
  39.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换
  40.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
  41.         ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目(根据ADC采集通道数量修改)                                                                                                                //修改六:通道数
  42.         ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
  43.         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
  44.         //ADC1,ADC通道x,规则采样顺序值为y,采样时间为28周期                 
  45.         ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_28Cycles5);//ADC1选择信道x,采样顺序y,采样时间n个周期                                        //修改七:信道要改为对应引脚通道

  46.         ADC_DMACmd(ADC1, ENABLE);// 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)
  47.         ADC_Cmd(ADC1, ENABLE);//使能ADC1
  48.         ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
  49.         while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
  50.         ADC_StartCalibration(ADC1);//开始ADC1校准
  51.         while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
  52.         ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
  53. }
 楼主| 纠结的那些年 发表于 2023-8-26 18:05 | 显示全部楼层
  1. #include "stm32f10x.h" //STM32头文件
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"

  5. #include "adc.h"

  6. extern vu16 ADC_DMA_IN5; //声明外部变量

  7. int main (void){//主程序
  8.         delay_ms(500); //上电时等待其他器件就绪
  9.         RCC_Configuration(); //系统时钟初始化
  10.         ADC_Configuration(); //ADC初始化设置
  11.         USART1_Init(115200);
  12.         while(1){
  13.                 printf("值:%0.3f\r\n",ADC_DMA_IN5*(3.3/4095));//光照公式
  14.                 delay_ms(500); //延时
  15.         }
  16. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部