要求
熟悉RT-Thread外设的使用。
使用开发板上的SPI FLASH做文件系统,熟悉文件系统的使用,熟悉命令。可以参考的文档有:书籍、文档中心
前提
熟悉RT-Thread外设的使用。文档中心中提供很多设备的手册,开发板支持的都可以试试。
熟悉文件系统:
- 文件系统资料:https://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/
- 文件系统应用:https://www.rt-thread.org/document/site/application-note/components/dfs/an0012-dfs/
作业
作业1:若现在控制台对应的是UART1,如何在UART2上实现控制台功能,请描述?
实验开发板环境(STM32F103ZET6最小系统板),本来直接想用潘多拉开发板的,无奈很多接口都无法外接出来。
方法1 .直接通过env配置
这个方法也是通过观看直播答疑才知道的,首先我们需要启动env工具来进行使能uart2如下图所示,
注意: 假如你在这里没有看到UART2这个选项怎么办?
这个时候需要手动添加一个外设,在board文件下有一个Kconfig文件,自己仿写一个即可。
可以参考https://www.rt-thread.org/document/site/application-note/driver/pwm/an0037-rtthread-driver-pwm/其中配置的
Kconfig文件。
也可参考相应的关于Kconfig的官方语法文档https://www.rt-thread.org/document/site/programming-manual/kconfig/kconfig/
再通过配置,将控制台名称改为uart2。
最后保存配置后,再使用命令行重新生成工程
scons --target=mdk5
方法2 .手动修改代码实现
- 通过CubeMX对外设UART2的一个开启配置
- 通过修改Kconfig配置文件,添加UART2进去
- 通过Env工具开启UART2
- 再编译生成新的工程
- 最后一步修改默认的控制台对应的UART1 为 UART2
rtthread_startup();
----rt_hw_board_init();
-----------rt_console_set_device(RT_CONSOLE_DEVICE_NAME); 以上为函数包含关系。
中修改RT_CONSOLE_DEVICE_NAME宏定义为 "uart2" 即可。
作业2
- PIN设备:如果开发板上有 user key,请使用按键PIN中断控制led的亮灭。
关于PIN设备的使用直接参考官方文档即可https://www.rt-thread.org/document/site/programming-manual/device/device/
- UART
官方文档https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/
需要注意的是RT-Thread 提供的默认串口配置如下,即 RT-Thread 系统中默认每个串口设备都使用如下配置:
/* Default config for serial_configure structure */
#define RT_SERIAL_CONFIG_DEFAULT \
{ \
BAUD_RATE_115200, /* 115200 bits/s */ \
DATA_BITS_8, /* 8 databits */ \
STOP_BITS_1, /* 1 stopbit */ \
PARITY_NONE, /* No parity */ \
BIT_ORDER_LSB, /* LSB first sent */ \
NRZ_NORMAL, /* Normal mode */ \
RT_SERIAL_RB_BUFSZ, /* Buffer size */ \
0 \
}
可以根据自己的需求,修改默认参数。但是修改数据缓冲区大小为 RT_SERIAL_RB_BUFSZ一定要在 open 设备之前进行。
#define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */
static rt_device_t serial; /* 串口设备句柄 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */
/* step1:查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);
/* step2:修改串口配置参数 */
config.baud_rate = BAUD_RATE_9600; //修改波特率为 9600
config.data_bits = DATA_BITS_8; //数据位 8
config.stop_bits = STOP_BITS_1; //停止位 1
config.bufsz = 128; //修改缓冲区 buff size 为 128
config.parity = PARITY_NONE; //无奇偶校验位
/* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
/* step4:打开串口设备。以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
在调试UART时遇到了一个数据分包的问题,具体可以参考这篇博文
https://blog.csdn.net/ylzmm/article/details/103009726
- I2C
内容较多可参考这篇博文https://blog.csdn.net/ylzmm/article/details/103016082
- SPI
内容较多可参考这篇博文
作业3:在自己的开发板上使用spi flash 虚拟文件系统FatFS,能使用文件系统的各个命令,提供截图
内容较多具体参考这篇博文https://blog.csdn.net/ylzmm/article/details/103088146
附加作业
完成下面的练习题。
1.定义如下变量和数组:
int k:
mt a[3][3]={9,8,7,6,5,4,3,2,1};
则下列语句的输出结果足( )。
for(k=0;k<3;k++)
printf("%d",a[k][k]);
(A) 7 5 3 (B) 9 5 1 (C) 9 6 3 (D) 7 4 1
答案: B
2.下面程序执行后,s1=( ), s2=( )
float b[]={0.5, 1.6, 2.7, 3.8, 4.9, 5, 6.1,6.2, 7.3, 8.4},sl,s2;
int i;
for(i=0,sl=s2=0 ; i<9 ; i++ )
{
if(i % 2)
sl += ( int ) b[i];
if(i % 3)
s2 -= b[i]- (int) b[i];
}
答案: 15.0 -2.7
3.已知int a[][3] = { { 0, 1 }, { 2, 3, 4 }, { 5, 6 }, { 7 } };则 a[2][1]的值是( )
答案:6
4.用直接插入排序方法对下面4个序列进行排序(由小到大),元素比较次数最少的是 ( )
A) 94,32,40,90,80,46,21,69
B) 32,40,21,46,69,94,90,80
C) 21,32,46,40,80,69,90,94
D) 90,69,80,46,21,32,94,40
答案: C
5.编程:输入两个正整数m和n,求其最大公约数和最小公倍数
实现代码:
int main()
{
int num1,num2,x,y,temp;
scanf("%d %d",&num1,&num2);
x = num1;
if(x >num2)
x = num2; //x取小的一个数
/*最大公约数*/
for(int i=x;i>=1;i--)
{
if(num1%i==0&&num2%i==0)
{
printf("最大公约数 %d",i);
temp = i;
break;
}
}
/*最小公倍数*/
printf("最小公倍数: %d",(num1*num2)/temp);
return 0;
}
6.设有一个栈,元素依次进栈的顺序为 A 、 B 、 C 、 D 、 E 。下列 是不可能的出栈序列
A) ABCDE
B) BCDEA
C) EABCD
D) EDCBA
答案 C
7.在一个单链表 HL 中,若要在当前由指针 p 指向的结点后面插入一个由 q 指向的结点,则执行如下 ( ) 语句序列。
A) p=q; p->next=q;
B) p->next=q; q->next=p;
C) p->next=q->next; p=q;
D) q->next=p->next; p->next=q;
答案 D
8.某公司申请到一个C类地址,但要连接到6个子公司,最大的一个子公司有26台电脑,每个子公司在一个网段中,则子网掩码应该设成()
A) 255.255.255.0
B) 255.255.255.128
C) 255.255.255.192
D) 255.255.255.224
答案 D
解析来自于直播答疑:
1、把子网数目从十进制转化为二进制数。本题6转换成2进制数为110;
2、统计得到的二进制位数N,本题N=3;
3、本题是C类地址,C类子网掩码255.255.255.0起,其中255.255.255为固定前缀,0为主机地址部分。把主机地址部分前N位全部置为1,本题为1110 0000=224(十进制)。
最后得到子网掩码为255.255.255.224
9.单任务系统中两个程序A和B,其中 A程序:CPU:10s -> 设备1:5s -> CPU:5s ->设备2:10s ->CPU:10s; B程序:设备1:10s-> CPU:10s -> 设备2:5s ->CPU:5s ->设备2:10s; 执行顺序为A->B,那么CPU的利用率是()
A) 30%
B) 40%
C) 50%
D) 60%
答案 C
10.ADC转换过程不含哪项( )
(A)采样 (B)量化 (C)编码 (D)逆采样
答案:D
11.Context – M3处理器的寄存器r14代表( )
(A)通用寄存器 (B)链接寄存器 (C)程序计数器 (D)程序状态寄存器
答案:B