一、唠嗑

LiuShen大佬在我实习的前一天发了一篇博文东软软件园实习日记,这样的记录是值得的,所以我也水一篇信盈达实习记录。写这一篇的记录的时候是实习的第二天。第一天实习属于是抱着很期待的心情来到全能科技公司(全能科技是信盈达的合作公司,所以没有去信盈达公司。据说后期会带我们去信盈达在郑州的分公司)。

​ 学校安排实习为期十天,公司安排中间休息一天,每天都要写实习报告和心得。最终考核为手搓一个基于STM32的智慧养老院。总体来讲难度不大,主要是小组里有大佬,我抱着躺平就行。

卧槽,突发事件,这篇文章还没把唠嗑写完,多吉云给我发消息说我欠费了,悬着的心终于死了,又又又被打了

二、实习日记

(一)2024-07-06实习日记

1. 时间安排

上午9:00-12:00;下午2:00-6:00;这又何尝不是一种上班呢。因为午休时间比较少,所以我一般不会回学校。

2. 公司环境

一般而言,实习第一天属于是参观式实习。早上7点,陈师傅早早的就起床了,墨迹到8点和旁边寝室的uu们一起坐地铁来到河南省国家大学科技园西区。全能科技距离我校很近,坐地铁三站即可。下车后步行7-8min达到目的地。

image-20240707105651451

全能科技公司牌面

image-20240707110628141

全能科技公司内景

科技园内的环境还不错,但是有点杂草丛生的感觉,还是挺喜欢园区内的桥和小河的。天太热了,所以没怎么拍(再说我拍照丑的一批),凑合着看吧。

image-20240707110350846

贯穿园区的桥

image-20240707110735901

园区的杂草和河

3.实习内容

上午什么都没学,纯自我介绍了。有趣的是,原定的实习项目智能小车因为在校已经做过,所以临时改成了智能养老院,但是换汤不换药吧还是要求做出实物。中午12点,开吃。带班老师推荐了几家餐厅,我们最后选择了一起去吃把子肉,谁不爱肉呢!!!!上菜之前忘记拍了,放一张残羹剩饭吧。

image-20240707111344151

把子肉残羹剩饭版

下午倒是学了一点东西,但是也都是之前做过的工作。总结一下,就是配置前置环境:安装Keil,破解Keil,看原理图以及新建标准库工程,没有写代码(⊙o⊙)?。新建项目倒是挺有用的。

image-20240707111957354

项目文件的目录树

OK,下班,回家,打阴阳师

image-20240707112222031

(二)2024-07-07实习日记

1.实习内容

友友们,我已经是一名成功的点灯工程师了,快来抱我大腿。说是实习,其实不是和公司有关的,更像是一种培训班,只不过这不是黑马程序员的软件培训而是嵌入式培训。

主要学习GPIO口,通过配置寄存器(这个比较难,但是不常见,所以我没有仔细听)和标准库编程。7月7号主要是将通过标准库进行点灯操作和蜂鸣器操作。比较简单,但是相比学校里教课的老师,培训老师讲的更贴近于实际应用。

image-20240709162129769

点灯工程师

OK,今天的实习就到这了。进度比较慢的,考虑到大多数哦同学吧😀

芜湖,晚上5:30的时候,园区内停电了,因为最近郑州风雨欲来吧。

b486ddbb5d53920d3739bb171d8fb7e

贴个代码吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "led.h"
#include "delay.h"
//LED灯配置函数
void LED_Config(void)
{
//1. 打开端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//2. 定义结构体
GPIO_InitTypeDef led = {0};
//3. 给结构体成员赋值
led.GPIO_Mode = GPIO_Mode_Out_PP;
led.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
led.GPIO_Speed = GPIO_Speed_50MHz;
//4. 调用初始化函数
GPIO_Init(GPIOC,&led);
}

//流水灯
void LED(void)
{
LED1_TOGGLE;
LED2_TOGGLE;
LED3_TOGGLE;
}

//呼吸灯
void LED_huxi(void)
{
uint16_t i=0;
for(i=0;i<2000;i += 3)
{
LED1_ON;
LED2_ON;
LED3_ON;
Delay_us(i);
LED1_OFF;
LED2_OFF;
LED3_OFF;
Delay_us(2000-i);
}

for(i=0;i<2000;i += 3)
{
LED1_ON;
LED2_ON;
LED3_ON;
Delay_us(2000-i);
LED1_OFF;
LED2_OFF;
LED3_OFF;
Delay_us(i);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _LED_H_
#define _LED_H_

#include "stm32f10x.h"

#define LED1_ON GPIO_WriteBit(GPIOC, GPIO_Pin_0,Bit_RESET)
#define LED1_OFF GPIO_WriteBit(GPIOC, GPIO_Pin_0,Bit_SET)
#define LED1_TOGGLE GPIO_WriteBit(GPIOC, GPIO_Pin_0,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)))

#define LED2_ON GPIO_WriteBit(GPIOC, GPIO_Pin_1,Bit_RESET)
#define LED2_OFF GPIO_WriteBit(GPIOC, GPIO_Pin_1,Bit_SET)
#define LED2_TOGGLE GPIO_WriteBit(GPIOC, GPIO_Pin_1,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_1)))

#define LED3_ON GPIO_WriteBit(GPIOC, GPIO_Pin_2,Bit_RESET)
#define LED3_OFF GPIO_WriteBit(GPIOC, GPIO_Pin_2,Bit_SET)
#define LED3_TOGGLE GPIO_WriteBit(GPIOC, GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_2)))

void LED_Config(void);
void LED(void);
void LED_huxi(void);
#endif

2.大名仕

5c9a82dda6d09baf610eecf01b860fb

(三)2024-07-08实习日记

今天郑州下大雨,很大很大,一直在下,实习暂停一天(目前还不知道之前安排的休息时间,会不会给取消掉,应该不会吧,求求您了)。学校莲湖的湖水都漫出来了,今天在图书馆呆了一天。

(四)2024-07-09实习日记

1.实习内容

讲了另一个外设按键,以及非阻塞,这使得按键切换功能十分的丝滑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
key.c
*/
#include "key.h"
#include "delay.h"
void KEY_Config(void)
{
//1. 打开端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
//2. 定义结构体
GPIO_InitTypeDef key = {0};
//3. 给结构体成员赋值
key.GPIO_Mode = GPIO_Mode_IN_FLOATING;
key.GPIO_Pin = GPIO_Pin_0;
// key.GPIO_Speed = GPIO_Speed_50MHz; //输入模式时速度可以省略
//4. 调用初始化函数
GPIO_Init(GPIOA,&key);

key.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOB,&key);
}

/*
按键消抖函数
*/

uint8_t key_GetValue(void)
{
static uint32_t count1 = 0, count2 = 0;

// 按键1
if(KEY1 == 1)
count1++;
else
{
if(count1 > 100) //按下超过1s------长按
{
count1 = 0;
return 1;
}
else if(count1 > 2)
{
count1 = 0;
return 2;
}
else
count1 = 0;
}
// 按键2
if(KEY2 == 0)
count2++;
else
{
if(count2 > 100) //按下超过1s------长按
{
count2 = 0;
return 3;
}
else if(count2 > 2)
{
count2 = 0;
return 4;
}
else
count2 = 0;
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
key.h
*/
#ifndef _KEY_H_
#define _KEY_H_

#include "stm32f10x.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8)

uint8_t key_GetValue(void);
void KEY_Config(void);

#endif

2. 午餐

价值10元的大锅炖,属于被坑了。和同学准备一起去吃饭的,被老板推推嚷嚷我独自买了这个(你看这肥肉yue🤮)。同学都去吃煲仔饭和羊肉泡馍了,不过好像也被被刺了,哈哈哈!!!!

image-20240712172203968

(五)2024-07-10实习日记

1.实习内容

今天主要讲了串口的内容,个人觉得还是比较简单的。简单的模板CV,简单的函数调用,毕竟原理的话我也不懂呀😀。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
usart1.c
*/
#include "usart1.h"
#include "stdio.h"
#include "string.h"

USART1_DATA Usart1_data = {0};

void USART1_Config(u32 brr)
{
//PA9---AF_PP PA10---IN_FLOATING
//1.打开A端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//2.定义结构体
GPIO_InitTypeDef GPIO_InitStruct = {0};
//3.赋值
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

//4.初始化PA9
GPIO_Init(GPIOA, &GPIO_InitStruct);

//5.初始化PA10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

//6.打开USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//7.定义USART1的结构体
USART_InitTypeDef USART1_InitStruct = {0};
//8.赋值--配置1+8+0+1
USART1_InitStruct.USART_BaudRate = brr;
USART1_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART1_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART1_InitStruct.USART_Parity = USART_Parity_No;
USART1_InitStruct.USART_StopBits = USART_StopBits_1;
USART1_InitStruct.USART_WordLength = USART_WordLength_8b;
//9.调用初始化
USART_Init(USART1, &USART1_InitStruct);
//10.使能串口
USART_Cmd(USART1, ENABLE);

//打开接受中断--用来接收数据
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//打开空闲中断---用来判断数据是否接收成功
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
//配置中断
NVIC_InitTypeDef NVIC_InitStruct = {0};
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //串口1通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //中断通道使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; //亚优先级
NVIC_Init(&NVIC_InitStruct);
}

void USART1_SendStr(uint8_t str[], u32 len)
{
u32 i = 0;
for(i=0; i<len; i++)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, str[i]);
}
}

//重定向fputc
int fputc(int ch, FILE*stream)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, ch);
return ch;
}

//中断服务函数
void USART1_IRQHandler(void)
{
volatile uint8_t data = 0;

//先判断中断是否发生
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//接收数据
Usart1_data.recvbuf[Usart1_data.recvcount++] = USART_ReceiveData(USART1);
Usart1_data.recvcount %= 16;
USART1 -> DR = USART1 -> DR;
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
{
data = USART1 -> SR;
data = USART1 -> DR; //清中断
Usart1_data.recvflag = 1; //数据接收完成标志位
}
}

void USART1_Analyse(void)
{
if(Usart1_data.recvflag == 1) //数据接收完成
{
if(Usart1_data.recvcount < 3)
goto err;
if(Usart1_data.recvbuf[0] == 0xAA && Usart1_data.recvbuf[3] == 0xBB)
{
switch(Usart1_data.recvbuf[2])
{
case 0x01: BEEP_ON; break;
case 0x00: BEEP_OFF; break;
}
}
err:
memset(&Usart1_data, 0, sizeof(Usart1_data)); //为下次接收做准备
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
usart1.h
*/
#ifndef _USART1_H_
#define _USART1_H_

#include "stm32f10x.h"
#include "stdio.h"
#include "beep.h"

typedef struct
{
uint8_t recvbuf[6]; //接收数据存放的缓存区
uint16_t recvcount; //接收的数量
uint8_t recvflag; //接收的标志位
}USART1_DATA;


void USART1_Config(u32 brr);
void USART1_SendStr(uint8_t str[], u32 len);
int fputc(int ch, FILE*stream);
void USART1_IRQHandler(void);
void USART1_Analyse(void);

#endif

2.午餐

18块钱一个人的自助餐。味道不错,感觉社会还是有光的,吃的很撑。而且,截至7-12号我已攒够9张餐券,等我再抢一张券就可以召唤免单券了。

image-20240712172947142

3.公司参观

下午,(整理衣领😀)应邀参观信盈达。公司比较小,所以展示的东西也比较少

5be0a4107208e48bb040c265046ef4d

9d7c04aac45fcf68ff92ce71f7762e5

39f6707f5558dfe74e9f7a2327cea1a

8e1a14cd22589d44afacd503313658c

(六)2024-07-11实习日记

1.实习内容

今天依旧如平常一样,讲解了外设屏幕的原理和实现。屏幕的代码太长了,就不放了,放几张我实现的效果吧。

image-20240712175059732

image-20240712175113872

image-20240712175125510

2.午餐

一般一般,在科技园餐厅吃的牛肉大葱的饺子,有一股子速冻味道,还收了我💴14💴,感觉血亏。

(七)2024-07-12实习日记

1.实习内容

学习了两个传感器:心率传感器和温湿度传感器(这是学校没有讲的,听得比较认真)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
\*
DHT11.c
*\
#include "DHT11.h"
#include "delay.h"
#include "stdio.h"

/*
配置DHT11 GPIO引脚
*/
void DHT11_ChangeMode(DHT_MODE mode)
{
//1. 打开端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//2. 定义结构体
GPIO_InitTypeDef dht11 = {0};
//3. 给结构体成员赋值
dht11.GPIO_Pin = GPIO_Pin_3;
dht11.GPIO_Speed = GPIO_Speed_50MHz; //输入模式时速度可以省略

if(mode)
{
dht11.GPIO_Mode = GPIO_Mode_Out_PP;
}
else
{
dht11.GPIO_Mode = GPIO_Mode_IPU;
}

//4. 调用初始化函数
GPIO_Init(GPIOC,&dht11);

}


/*
初始化DHT11
*/
void DHT11_Config(void)
{
DHT11_ChangeMode(DHT11_OUT);
DHT11_HIGH;
}

/*
DHT11获取数据
*/

uint8_t DHT11_ReadData(DHT11_DATA *dh_data)
{
uint8_t retry = 0;
uint8_t i = 0;
uint8_t data[5] = {0}; //存数据
DHT11_Config();
//拉低等待大于18ms
DHT11_LOW;
Delay_ms(22);
DHT11_HIGH;
DHT11_ChangeMode(DHT11_INT);

//等待低电平的到来
while(DHT11_READ == 1)
{
retry++;
Delay_us(1);
if(retry > 100)
{
return 1;
}
}
retry = 0;
//等待高电平的到来
while(DHT11_READ == 0)
{
retry++;
Delay_us(1);
if(retry > 100)
{
return 1;
}
}
retry = 0;

//准备接收数据
for(i=0; i < 40; i++)
{
//等待低电平到来
while(DHT11_READ == 1)
{
retry++;
Delay_us(1);
if(retry > 100)
{
return 1;
}
}
retry = 0;
//等待高电平到来
while(DHT11_READ == 0)
{
retry++;
Delay_us(1);
if(retry > 100)
{
return 1;
}
}
retry = 0;

//延时30us判断接收到的是0还是1
Delay_us(30);
if(DHT11_READ == 1)
{
data[i/8] |= (1<<(7-i%8));
}
else
{
data[i/8] &= ~(1<<(7-i%8));
}
}
//校验数据
if(data[4]==data[0]+data[1]+data[2]+data[3])
{
dh_data -> hum = data[0];
dh_data -> tem = data[2];
return 0;
}
else
{
printf("温湿度获取失败");
return 1;
}
return 0;
}

/*
DHT11打印函数
*/
DHT11_DATA dht11_data = {0};

void DHT11_Show(void)
{
DHT11_ReadData(&dht11_data);
printf("当前温度:%d\t湿度:%d\r\n",dht11_data.tem,dht11_data.hum);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
dht11.h
*/
#ifndef __DHT11_H
#define __DHT11_H

#include "stm32f10x.h"

typedef enum
{
DHT11_INT = 0,
DHT11_OUT = 1,
}DHT_MODE;

typedef struct
{
int16_t tem;
int16_t hum;
}DHT11_DATA;

#define DHT11_HIGH GPIO_WriteBit(GPIOC, GPIO_Pin_3,Bit_SET)
#define DHT11_LOW GPIO_WriteBit(GPIOC, GPIO_Pin_3,Bit_RESET)
#define DHT11_READ GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)

void DHT11_ChangeMode(DHT_MODE mode);
void DHT11_Config(void);
uint8_t DHT11_ReadData(DHT11_DATA *dh_data);
void DHT11_Show(void);

#endif

2. 午餐

今天有没有人吃18元的自助餐。今天吃的是10块钱的炒饭,味道还可以,就是太噎人了。

3.实现结果

a4f1f5b7ba62ce7ed38c94456f16f23c