【WCH】CH32F203软件I2C驱动SSD1306 OLED

2023-10-21 02:59

本文主要是介绍【WCH】CH32F203软件I2C驱动SSD1306 OLED,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【WCH】CH32F203软件I2C驱动SSD1306 OLED


  • 📌相关篇《【WCH】CH32F203硬件I2C驱动SSD1306 OLED》
  • 📺驱动显示效果:
    在这里插入图片描述
  • 🌿OLED屏幕:i2c ssd1306 oled
  • 🔖驱动单片机型号:CH32F203
  • ✨由于CH32F203主频为96MHz,测试了144MHz下也可以驱动显示。如果是从屏幕厂商提供的程序,需要修改相应的延时时间来匹配通讯时序。
    在这里插入图片描述

📑引脚定义

 I2C1_SCL(PB8)I2C1_SDA(PB9).

📑OLED驱动程序

  • 🌿oled.c
#include "oled.h"
#include "oledfont.h"static u8 OLED_GRAM[144][8];void OLED_ColorTurn(u8 i)//反显函数
{if(i == 0){OLED_WR_Byte(0xA6, OLED_CMD); //正常显示}if(i == 1){OLED_WR_Byte(0xA7, OLED_CMD); //反色显示}
}//屏幕旋转180度
void OLED_DisplayTurn(u8 i)
{if(i == 0){OLED_WR_Byte(0xC8, OLED_CMD); //正常显示OLED_WR_Byte(0xA1, OLED_CMD);}if(i == 1){OLED_WR_Byte(0xC0, OLED_CMD); //反转显示OLED_WR_Byte(0xA0, OLED_CMD);}
}//延时
static void IIC_delay(void)
{u8 t = 3*10;while(t--);
}//起始信号
static void I2C_Start(void)
{OLED_SDA_Set();OLED_SCL_Set();IIC_delay();OLED_SDA_Clr();IIC_delay();OLED_SCL_Clr();IIC_delay();
}//结束信号
static void I2C_Stop(void)
{OLED_SDA_Clr();OLED_SCL_Set();IIC_delay();OLED_SDA_Set();
}//等待信号响应
static void I2C_WaitAck(void) //测数据信号的电平
{OLED_SDA_Set();IIC_delay();OLED_SCL_Set();IIC_delay();OLED_SCL_Clr();IIC_delay();
}//写入一个字节
static void Send_Byte(u8 dat)
{u8 i;for(i = 0; i < 8; i++){if(dat & 0x80) //将dat的8位从最高位依次写入{OLED_SDA_Set();}else{OLED_SDA_Clr();}IIC_delay();OLED_SCL_Set();IIC_delay();OLED_SCL_Clr();//将时钟信号设置为低电平dat <<= 1;}
}//发送一个字节
//mode:数据/命令标志 0,表示命令;1,表示数据;
static void OLED_WR_Byte(u8 dat, u8 mode)
{I2C_Start();Send_Byte(0x78);I2C_WaitAck();if(mode){Send_Byte(0x40);}else{Send_Byte(0x00);}I2C_WaitAck();Send_Byte(dat);I2C_WaitAck();I2C_Stop();
}//开启OLED显示
void OLED_DisPlay_On(void)
{OLED_WR_Byte(0x8D, OLED_CMD); //电荷泵使能OLED_WR_Byte(0x14, OLED_CMD); //开启电荷泵OLED_WR_Byte(0xAF, OLED_CMD); //点亮屏幕
}//关闭OLED显示
void OLED_DisPlay_Off(void)
{OLED_WR_Byte(0x8D, OLED_CMD); //电荷泵使能OLED_WR_Byte(0x10, OLED_CMD); //关闭电荷泵OLED_WR_Byte(0xAE, OLED_CMD); //关闭屏幕
}//更新显存到OLED
void OLED_Refresh(void)
{u8 i, n;for(i = 0; i < 8; i++){OLED_WR_Byte(0xb0 + i, OLED_CMD); //设置行起始地址OLED_WR_Byte(0x00, OLED_CMD);  //设置低列起始地址OLED_WR_Byte(0x10, OLED_CMD);  //设置高列起始地址I2C_Start();Send_Byte(0x78);I2C_WaitAck();Send_Byte(0x40);I2C_WaitAck();for(n = 0; n < 128; n++){Send_Byte(OLED_GRAM[n][i]);I2C_WaitAck();}I2C_Stop();}
}
//清屏函数
void OLED_Clear(void)
{u8 i, n;for(i = 0; i < 8; i++){for(n = 0; n < 128; n++){OLED_GRAM[n][i] = 0; //清除所有数据}}OLED_Refresh();//更新显示
}//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPoint(u8 x, u8 y, u8 t)
{u8 i, m, n;i = y / 8;m = y % 8;n = 1 << m;if(t){OLED_GRAM[x][i] |= n;}else{OLED_GRAM[x][i] = ~OLED_GRAM[x][i];OLED_GRAM[x][i] |= n;OLED_GRAM[x][i] = ~OLED_GRAM[x][i];}
}//画线
//x1,y1:起点坐标
//x2,y2:结束坐标
void OLED_DrawLine(u8 x1, u8 y1, u8 x2, u8 y2, u8 mode)
{u16 t;int xerr = 0, yerr = 0, delta_x, delta_y, distance;int incx, incy, uRow, uCol;delta_x = x2 - x1; //计算坐标增量delta_y = y2 - y1;uRow = x1; //画线起点坐标uCol = y1;if(delta_x > 0)incx = 1; //设置单步方向else if(delta_x == 0)incx = 0; //垂直线else{incx = -1;delta_x = -delta_x;}if(delta_y > 0)incy = 1;else if(delta_y == 0)incy = 0; //水平线else{incy = -1;delta_y = -delta_x;}if(delta_x > delta_y)distance = delta_x; //选取基本增量坐标轴else distance = delta_y;for(t = 0; t < distance + 1; t++){OLED_DrawPoint(uRow, uCol, mode); //画点xerr += delta_x;yerr += delta_y;if(xerr > distance){xerr -= distance;uRow += incx;}if(yerr > distance){yerr -= distance;uCol += incy;}}
}
//x,y:圆心坐标
//r:圆的半径
void OLED_DrawCircle(u8 x, u8 y, u8 r)
{int a, b, num;a = 0;b = r;while(2 * b * b >= r * r){OLED_DrawPoint(x + a, y - b, 1);OLED_DrawPoint(x - a, y - b, 1);OLED_DrawPoint(x - a, y + b, 1);OLED_DrawPoint(x + a, y + b, 1);OLED_DrawPoint(x + b, y + a, 1);OLED_DrawPoint(x + b, y - a, 1);OLED_DrawPoint(x - b, y - a, 1);OLED_DrawPoint(x - b, y + a, 1);a++;num = (a * a + b * b) - r * r; //计算画的点离圆心的距离if(num > 0){b--;a--;}}
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 size1, u8 mode)
{u8 i, m, temp, size2, chr1;u8 x0 = x, y0 = y;if(size1 == 8)size2 = 6;else size2 = (size1 / 8 + ((size1 % 8) ? 1 : 0)) * (size1 / 2); //得到字体一个字符对应点阵集所占的字节数chr1 = chr - ' '; //计算偏移后的值for(i = 0; i < size2; i++){if(size1 == 8){temp = asc2_0806[chr1][i];   //调用0806字体}else if(size1 == 12){temp = asc2_1206[chr1][i];   //调用1206字体}else if(size1 == 16){temp = asc2_1608[chr1][i];   //调用1608字体}else if(size1 == 24){temp = asc2_2412[chr1][i];   //调用2412字体}else return;for(m = 0; m < 8; m++){if(temp & 0x01)OLED_DrawPoint(x, y, mode);else OLED_DrawPoint(x, y, !mode);temp >>= 1;y++;}x++;if((size1 != 8) && ((x - x0) == size1 / 2)){x = x0;y0 = y0 + 8;}y = y0;}
}//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x, u8 y, u8* chr, u8 size1, u8 mode)
{while((*chr >= ' ') && (*chr <= '~')) //判断是不是非法字符!{OLED_ShowChar(x, y, *chr, size1, mode);if(size1 == 8)x += 6;else x += size1 / 2;chr++;}
}//m^n
static u32 OLED_Pow(u8 m, u8 n)
{u32 result = 1;while(n--){result *= m;}return result;
}//显示数字
//x,y :起点坐标
//num :要显示的数字
//len :数字的位数
//size:字体大小
//mode:0,反色显示;1,正常显示
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size1, u8 mode)
{u8 t, temp, m = 0;if(size1 == 8)m = 2;for(t = 0; t < len; t++){temp = (num / OLED_Pow(10, len - t - 1)) % 10;if(temp == 0){OLED_ShowChar(x + (size1 / 2 + m)*t, y, '0', size1, mode);}else{OLED_ShowChar(x + (size1 / 2 + m)*t, y, temp + '0', size1, mode);}}
}//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//mode:0,反色显示;1,正常显示
void OLED_ShowChinese(u8 x, u8 y, u8 num, u8 size1, u8 mode)
{u8 m, temp;u8 x0 = x, y0 = y;u16 i, size3 = (size1 / 8 + ((size1 % 8) ? 1 : 0)) * size1; //得到字体一个字符对应点阵集所占的字节数for(i = 0; i < size3; i++){if(size1 == 16){temp = Hzk1[num][i];   //调用16*16字体}else if(size1 == 24){temp = Hzk2[num][i];   //调用24*24字体}else if(size1 == 32){temp = Hzk3[num][i];   //调用32*32字体}else if(size1 == 64){temp = Hzk4[num][i];   //调用64*64字体}else return;for(m = 0; m < 8; m++){if(temp & 0x01)OLED_DrawPoint(x, y, mode);else OLED_DrawPoint(x, y, !mode);temp >>= 1;y++;}x++;if((x - x0) == size1){x = x0;y0 = y0 + 8;}y = y0;}
}
//默认左移
//num 显示汉字的个数
//space 每一遍显示的间隔
//mode:0,反色显示;1,正常显示
void OLED_ScrollDisplay(u8 num, u8 space, u8 mode)
{u8 i, n, t = 0, m = 0, r;while(1){if(m == 0){OLED_ShowChinese(128, 0, t, 16, mode); //写入一个汉字保存在OLED_GRAM[][]数组中t++;}if(t == num){for(r = 0; r < 16 * space; r++) //显示间隔{for(i = 1; i < 144; i++){for(n = 0; n < 8; n++){OLED_GRAM[i - 1][n] = OLED_GRAM[i][n];}}OLED_Refresh();}t = 0;}m++;if(m == 16){m = 0;}for(i = 1; i < 144; i++) //实现左移{for(n = 0; n < 8; n++){OLED_GRAM[i - 1][n] = OLED_GRAM[i][n];}}OLED_Refresh();}
}//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
//mode:0,反色显示;1,正常显示
void OLED_ShowPicture(u8 x, u8 y, u8 sizex, u8 sizey, u8 BMP[], u8 mode)
{u16 j = 0;u8 i, n, temp, m;u8 x0 = x, y0 = y;sizey = sizey / 8 + ((sizey % 8) ? 1 : 0);for(n = 0; n < sizey; n++){for(i = 0; i < sizex; i++){temp = BMP[j];j++;for(m = 0; m < 8; m++){if(temp & 0x01)OLED_DrawPoint(x, y, mode);else OLED_DrawPoint(x, y, !mode);temp >>= 1;y++;}x++;if((x - x0) == sizex){x = x0;y0 = y0 + 8;}y = y0;}}
}
//OLED的初始化
void OLED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);	 //使能A端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC, GPIO_Pin_12);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_2);OLED_RES_Clr();Delay_Ms(200);OLED_RES_Set();OLED_WR_Byte(0xAE, OLED_CMD); //--turn off oled panelOLED_WR_Byte(0x00, OLED_CMD); //---set low column addressOLED_WR_Byte(0x10, OLED_CMD); //---set high column addressOLED_WR_Byte(0x40, OLED_CMD); //--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81, OLED_CMD); //--set contrast control registerOLED_WR_Byte(0xCF, OLED_CMD); // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1, OLED_CMD); //--Set SEG/Column Mapping     0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8, OLED_CMD); //Set COM/Row Scan Direction   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6, OLED_CMD); //--set normal displayOLED_WR_Byte(0xA8, OLED_CMD); //--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f, OLED_CMD); //--1/64 dutyOLED_WR_Byte(0xD3, OLED_CMD); //-set display offset	Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00, OLED_CMD); //-not offsetOLED_WR_Byte(0xd5, OLED_CMD); //--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80, OLED_CMD); //--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9, OLED_CMD); //--set pre-charge periodOLED_WR_Byte(0xF1, OLED_CMD); //Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA, OLED_CMD); //--set com pins hardware configurationOLED_WR_Byte(0x12, OLED_CMD);OLED_WR_Byte(0xDB, OLED_CMD); //--set vcomhOLED_WR_Byte(0x40, OLED_CMD); //Set VCOM Deselect LevelOLED_WR_Byte(0x20, OLED_CMD); //-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02, OLED_CMD); //OLED_WR_Byte(0x8D, OLED_CMD); //--set Charge Pump enable/disableOLED_WR_Byte(0x14, OLED_CMD); //--set(0x10) disableOLED_WR_Byte(0xA4, OLED_CMD); // Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6, OLED_CMD); // Disable Inverse Display On (0xa6/a7)OLED_Clear();OLED_WR_Byte(0xAF, OLED_CMD);
}
  • 🌿oled.h
#ifndef __OLED_H
#define __OLED_H #include "debug.h"
#include "stdlib.h"//-----------------OLED端口定义---------------- #define OLED_SCL_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)//SCL
#define OLED_SCL_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)#define OLED_SDA_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)//SDA
#define OLED_SDA_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)#define OLED_RES_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_2)//RES
#define OLED_RES_Set() GPIO_SetBits(GPIOA,GPIO_Pin_2)#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
static void I2C_Start(void);
static void I2C_Stop(void);
static void I2C_WaitAck(void);
static void Send_Byte(u8 dat);
static void OLED_WR_Byte(u8 dat,u8 mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
void OLED_Init(void);#endif

📝main主程序代码

/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2021/08/08
* Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************//**@NoteI2C1_SCL(PB8)\I2C1_SDA(PB9).Hardware connection:PB8--sclPB9--sda*/#include "debug.h"
//#include <stdio.h>
#include "oled.h"
#include "bmp.h"/********************************************************************** @fn      main** @brief   Main program.** @return  none*/
int main(void)
{u8 t = ' ';Delay_Init();//延时函数初始化USART_Printf_Init(115200);printf("SystemClk:%d\r\n", SystemCoreClock);OLED_Init();printf("Init \r\n");OLED_ColorTurn(0);//0正常显示,1 反色显示OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示OLED_DrawPoint(15, 15, 1);OLED_Refresh();while(1){OLED_ShowPicture(0, 0, 128, 64, BMP1, 1);OLED_Refresh();Delay_Ms(500);OLED_Clear();OLED_ShowChinese(0, 0, 0, 16, 1); //中OLED_ShowChinese(18, 0, 1, 16, 1); //景OLED_ShowChinese(36, 0, 2, 16, 1); //园OLED_ShowChinese(54, 0, 3, 16, 1); //电OLED_ShowChinese(72, 0, 4, 16, 1); //子OLED_ShowChinese(90, 0, 5, 16, 1); //技OLED_ShowChinese(108, 0, 6, 16, 1); //术OLED_ShowString(8, 16, "ZHONGJINGYUAN", 16, 1);OLED_ShowString(20, 32, "2014/05/01", 16, 1);OLED_ShowString(0, 48, "ASCII:", 16, 1);OLED_ShowString(63, 48, "CODE:", 16, 1);OLED_ShowChar(48, 48, t, 16, 1); //显示ASCII字符t++;if(t > '~')t = ' ';OLED_ShowNum(103, 48, t, 3, 16, 1);OLED_Refresh();Delay_Ms(500);OLED_Clear();OLED_ShowChinese(0, 0, 0, 16, 1); //16*16 中OLED_ShowChinese(16, 0, 0, 24, 1); //24*24 中OLED_ShowChinese(24, 20, 0, 32, 1); //32*32 中OLED_ShowChinese(64, 0, 0, 64, 1); //64*64 中OLED_Refresh();Delay_Ms(500);OLED_Clear();OLED_ShowString(0, 0, "ABC", 8, 1); //6*8 “ABC”OLED_ShowString(0, 8, "ABC", 12, 1); //6*12 “ABC”OLED_ShowString(0, 20, "ABC", 16, 1); //8*16 “ABC”OLED_ShowString(0, 36, "ABC", 24, 1); //12*24 “ABC”OLED_Refresh();OLED_Clear();Delay_Ms(500);OLED_ScrollDisplay(11, 3, 1);//向左滚动显示}
}

📚程序源码


链接: https://pan.baidu.com/s/1j7Csl_Dzi9qwCT67wFPgCA
提取码: 5eh6

这篇关于【WCH】CH32F203软件I2C驱动SSD1306 OLED的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251480

相关文章

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2